java中静态类的仿真

java中静态类的仿真,java,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 { // ... p

您认为以下在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) {...}
    }

我的FindBugs插件建议使用最终类而不是抽象类。我在我的项目中使用它。如果FindBugs检查它成为一条规则,那么它似乎是一个广泛使用的习惯用法。

我会说,如果你已经是一个私有构造函数的话

专用工具(){}

抽象关键字不是必需的。我宁愿把它定下来


对于任何实际方法来说,与您的版本的差异都是微不足道的。

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

  • 它阻止创建对象(从类外部)
  • 它阻止了继承

abstract关键字向用户建议,类的用户可能实现了类,但这里不是这样。

我更喜欢将此类类设置为final,而不是
abstract
。虽然这只是个人风格的问题


顺便说一句,如果你投入一些精力,我想仍然可以调用它的实例方法。例如,可以尝试使用创建类的实例

我的建议是:通过放置javadocs来防止不正确的使用(即实例化)


这不是更简单吗?我认为你的队友能够阅读;)

我必须同意上面的观点。使用“最终”而不是“摘要”。记住,像“final”和“abstract”这样的词既是对机器的指令,也是与其他程序员交流的一种方式。抽象意味着以后会有子类,而final则明确地意味着,除了重构之外,您不会看到这个类的任何子类(这是您想要的意思)


此外,在我所见过的大多数标准中,以及在我的公司中,将抽象类作为其他类的父类之外的特定未使用对象,被认为是最佳实践。“抽象”被视为“蓝图”或“总体结构”,你永远不会驾驶“抽象”汽车。另一方面,最终类是永久实例化的,特别是使用工厂模式。

在(一本非常……有效的书)中的第4项说:

因为显式构造函数是私有的:

  • 您不能实例化它
  • 您不能扩展它(就好像它被声明为final一样)
AssertionError
不是必需的,但它提供了另一个小好处:它可以防止从类中意外调用costructior

您还可以创建特定的注释,如@Bagoff函数,并注释您的类:

@BagOfFunctions
public final class Utility {

    private Utility() {
        throw new AssertionError();
    }
}

基本上,您可以用一条注释来换取一条自文档注释。

这是Java中的标准习惯用法。看到这样的类,你甚至不需要读=),你一眼就能看出它是一个实用工具。@Megadix:这并不是说他们不能读Javadoc。更重要的是他们不读Javadoc。就像许多人在网上发布Java问题一样!在编译时强制执行非实例化约束有很大的价值,您应该尽可能多地执行。即使阻止继承,我仍然会包括
final
关键字。所有答案都差不多。您可能应该在第一个代码示例中添加单词final,就像下面的答案一样。特别是因为异常甚至阻止了使用反射创建对象。您能解释一下@BagOfFunctions注释的用法吗?因为javadoc显示了注释(如此API中的@GwtCompatible),所以您可以对类进行注释,以记录它实际上是一个函数包
@BagOfFunctions
public final class Utility {

    private Utility() {
        throw new AssertionError();
    }
}