我有很多程序在我的班级顶层声明对象.此对象仅在其自己的类中进行修改,并且此类的实例永远不会同时运行.将对象声明为静态有什么好处吗?
public class MyClass {
private Map<String, Object> myMap; // any reason to make this static?
// constructor and other code here
}
最佳答案
Is there any benefit to declaring the objects as static?
不是,不是.
当然,没有性能优势.这是因为静态实际存储在堆中的(隐藏的)静态帧对象中.最终,JIT将生成用于获取静态变量的本机代码,该静态变量不会快于对象变量获取.
您可能会认为使用静态在应用程序中“全局”共享某些数据结构会更方便.但是这种便利性有一些明显的缺点.最重要的是静态使测试变得更加困难,并且它们使代码重用变得更加困难.
但是,您不应该将一般情况与静态持有或引用不可变值或数据结构的特定情况混淆;例如像String常量或常量映射.这些在设计和实践方面都是合理的;例如
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);
}
这很好……只要不同的(当前或未来的)用例不可能需要不同的值/映射/等等.如果这是可能的,那么静电可能是有害的.