唯一的区别是你仍然可以在你的类中调用构造函数:
public final class UtilityClass {
public static final UtilityClass Instance = new UtilityClass();
private UtilityClass () {}
public static int Foo (int a, int b) {
return a+b;
}
}
但是由于您是该类的设计者,因此破坏您自己的代码合同没有任何意义。
一般来说,我读过的大多数软件设计书籍都反对使用静态方法。除非它们真的是实用方法:从某种意义上说,它们永远不需要任何状态。即便如此,实现单例模式也只是很小的努力,这样,当时机成熟时,您可以为它分配状态:
public final class UtilityClass {
public static final UtilityClass Instance = new UtilityClass();
private UtilityClass () {}
public int Foo (int a, int b) {
return a+b;
}
}
并用UtilityClass.Instance.Foo(2,5);
. 稍后在编码过程中执行引入状态转换将更加困难。因此静态方法更难维护。
实例有用的原因是您可以在很多模式中使用它们,例如策略,如果在某个情况下它取决于应该做什么,......通过使用static
方法,可以降低方法的动态性,因为 Java 没有支持方法指针(有充分的理由)。因此,非静态方法更加动态和有用。
此外,一些安全研究人员认为,使用static
修饰符分析代码更加困难,因为它们可以从任何地方访问,并且副作用难以预测(例如在自动安全分析工具中):假设您有一个未完全实现的类,那么您仍然可以分析字段以了解它可以访问哪些方法,从而分析可能的副作用(网络使用情况、文件 IO ......)。这可以生成应验证的每个类别的可能危害列表。至少如果我理解我的一位研究人员的博士论文是正确的。因此,非静态方法允许更多的修饰符分析。
总结:Java 是建立在面向对象编程的原则之上的。这意味着编译器使用“类世界”,解释器/运行时使用“实例世界”。我同意这两个词之间有很多冲突。但是在许多/某些情况下,解决此类冲突的方法是错误的。static