我有许多程序在我的班级顶部声明对象。这个对象只会在它自己的类中被修改,并且永远不会有超过一个这个类的实例同时运行。将对象声明为 有什么好处static
?
public class MyClass {
private Map<String, Object> myMap; // any reason to make this static?
// constructor and other code here
}
我有许多程序在我的班级顶部声明对象。这个对象只会在它自己的类中被修改,并且永远不会有超过一个这个类的实例同时运行。将对象声明为 有什么好处static
?
public class MyClass {
private Map<String, Object> myMap; // any reason to make this static?
// constructor and other code here
}
将变量声明为静态使变量在类的所有对象(在您的示例中为 MyClass)之间共享另一件事,您可以使静态方法返回变量而无需创建类的对象
MyClass.method();
有时这比创建 MyClass 的对象然后调用方法更有意义,例如 Math 类的一个侧面问题:如果您只想拥有 MyClass 的一个实例,请检查单例设计模式,它只确保类的实例
使成员成为静态的一个原因是常量。public static final Sting SOME_CONSTANT = "amazing";
静态访问比通过实例更容易。
不使用静态成员的原因是测试(如何轻松模拟静态成员?)或(特别是使用映射)线程安全性。
将对象声明为静态有什么好处吗?
不是真的,不。
当然,没有性能优势。这是因为静态数据实际上存储在(隐藏的)堆中的静态帧对象中。最终,JIT 将生成本机代码来获取不比对象变量获取快的静态变量。
您可能会争辩说,使用静态在应用程序中“全局”共享某些数据结构更方便。但这种便利有一些明显的缺点。最大的问题是静态使测试更加困难,并且它们使代码重用更加困难。
但是,您不应将一般情况与静态保存或引用不可变值或数据结构的特定情况混淆。例如,像字符串常量或常量映射。这些在设计和实践上都可以证明是合理的;例如
public static final String THE_ANSWER = "Forty two";
private static final Map<String, Integer> SCORES;
static {
Map<String, Integer> map = new HashMap<>();
tmp.put("perfect", 100);
tmp.put("average", 50);
tmp.put("fail", 20);
SCORE = Collections.unmodifiableMap(map);
}
这很好......只要不同的(当前或未来)用例不可能需要不同的值/映射/其他。如果这是一种可能性,那么static
可能是有害的。