即使它们不需要,也可以使对象保持静态?

时间:2013-07-26 23:53:29

标签: java performance object static

我有很多程序在我的班级顶层声明对象。此对象仅在其自己的类中进行修改,并且此类的实例永远不会同时运行。将对象声明为static

有什么好处
public class MyClass {

    private Map<String, Object> myMap; // any reason to make this static?

    // constructor and other code here
}

3 个答案:

答案 0 :(得分:1)

将变量声明为static会使变量在类的所有对象之间共享(在您的示例中为MyClass) 另一件事你可以使静态方法返回变量而不创建类的对象

MyClass.method();

有时这比创建MyClass的对象更有意义,然后调用Method,就像Math类一样 一方面问题: 如果你想只有一个MyClass实例,请选中Singleton Design Pattern,它只保证类的实例

答案 1 :(得分:1)

使成员静态的一个原因是常量。 public static final Sting SOME_CONSTANT = "amazing";比实例更容易静态访问。

不使用静态成员的原因是测试(如何轻松模拟静态成员?)或(特别是使用地图)线程安全性。

答案 2 :(得分:0)

  

将对象声明为静态有什么好处吗?

不是,不。

当然,没有性能优势。这是因为静态实际存储在堆中的(隐藏的)静态帧对象中。最终,JIT将生成本机代码,用于获取不比对象变量提取快的静态变量。


您可能会认为使用静态在应用程序中“全局”共享某些数据结构会更方便。但是这种便利性有一些明显的缺点。最重要的是静态使测试变得更加困难,并且它们使代码重用变得更加困难。


但是,您不应该将一般情况与静态持有或引用不可变值或数据结构的特定情况混淆;例如像String常量或常量映射。这些在设计和实践方面都是合理的; e.g。

  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可能是有害的。