java中静态类的模拟

Ger*_*ard 2 java

您如何看待以下在java中模拟静态类的方法?您可以添加非静态方法,但无法调用它们.

 /**
  * Utility class: this class contains only static methods and behaves as a static class.
  */
 // ... prevent instantiation with abstract keyword
 public abstract class Utilities
    {
        // ... prevent inheritance with private constructor
        private Utilities() {}

        // ... all your static methods here
        public static Person convert(String foo) {...}
    }
Run Code Online (Sandbox Code Playgroud)

dme*_*ter 8

这是通常的方式.但是,不需要abstract关键字.使用私有构造函数就足够了

  • 它阻止了对象的创建(来自课外)
  • 它可以防止继承

抽象的关键字表明,类可能的用户执行的类究竟是不是这里的情况的用户.

  • 即使继承被阻止,我仍然会包含`final`关键字. (4认同)

dfa*_*dfa 5

第4项有效的Java(一种非常有效的......书)说:

// Noninstantiable utility class
public final class Utility {

    private Utility() {
        throw new AssertionError();
    }
}
Run Code Online (Sandbox Code Playgroud)

因为显式的costructor是私有的:

  • 你无法实例化它
  • 你不能扩展它(好像它被宣布为最终)

AssertionError不是必需的,但它提供了另一个小的好处:它可以防止在类中意外调用costructior.

您还可以创建特定的注释,例如@BagOfFunction,并为您的类注释:

@BagOfFunctions
public final class Utility {

    private Utility() {
        throw new AssertionError();
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上你交换一个自我记录注释的评论.