Java:静态类?
我有一个充满实用function的课程。 实例化它的一个实例没有语义意义,但我仍然想要调用它的方法。 处理这个问题的最好方法是什么? 静态类? 抽象?
私有构造函数和类上的静态方法标记为final。
根据“有效的Java”这本伟大的书:
项目4:通过私人构造函数强化不可证实性
– 试图通过使类抽象不起作用来强制实现不可信性。
– 只有当一个类不包含显式的构造函数时,才会生成一个默认的构造函数,所以通过包含一个私有的构造函数可以使一个类变为不可证实的:
// Noninstantiable utility class public class UtilityClass { // Suppress default constructor for noninstantiability private UtilityClass() { throw new AssertionError(); } }
因为显式构造函数是私有的,所以在类之外是不可访问的。 AssertionError并不是严格要求的,但是如果构造函数是在类中被意外调用的,那么它提供了保险。 它保证在任何情况下都不会实例化类。 这个习惯用法是轻度违反直觉的,因为构造函数是明确提供的,所以不能被调用。 如上所示,包括评论是明智的。
作为一个副作用,这个习语还可以防止课程被分类。 所有构造函数都必须显式或隐式地调用超类的构造函数,并且子类将没有可访问的超类构造函数来调用。
听起来就像你有一个类似java.lang.Math的工具类。
最后的方法是私有构造函数和静态方法。
但要小心这对可testing性有什么作用,我推荐阅读这篇文章
静态方法是对可testing性的死亡
为了游泳上游,静态的成员和class级不参加面向对象,因此是邪恶的。 不,不是邪恶的,但严重的是,我会推荐一个有单身模式的普通class级。 这样,如果您需要在任何情况下覆盖行为,这不是一个重大的工具。 OO是你的朋友:-)
我的.02
评论“私人build设者”的论点:来吧,开发商不是那么愚蠢的; 但他们是懒惰的。 创build一个对象,然后调用静态方法? 不会发生。
不要花太多时间来确保你的class级不会被滥用。 对你的同事有一些信心。 而且无论你如何保护它,总会有一种误用你的课程的方法。 唯一不能被滥用的东西是完全没用的东西。
- 最终课堂和私人构造(好,但不是必需的)
- 公共静态方法
把这个类声明为static
是没有意义的。 只要声明它的方法是static
并像普通的Java类一样从类名中调用它们。
另外,即使不是严格需要将构造函数设为私有的,但这样做也是一个好主意。 将构造函数标记为私有可以防止其他人创build类的实例,然后从这些实例中调用静态方法。 (这些调用在Java中完全一样,它们只是误导,并且损害了代码的可读性。)