【问题标题】:How can be the best way to create constants in Java program?在 Java 程序中创建常量的最佳方法是什么?
【发布时间】:2014-12-04 06:56:58
【问题描述】:

我有两种选择:

第一:单例设计模式

public class A{
   private static A instance;
   private A(){};
   public A getDefault(){
   if(instance == null)
      instance = new A();
   return instance;
   }
//cst
public static final String cst = "sample";
}

这样,我们就可以通过A.getDefault().cst访问cst

第二:类的引用

public class B{
   public static final String cst = "sample";
}

这样,我们就可以通过B.cst 访问cst,很简单。

考虑到性能(对我来说常量是编号并具有图像类型)的最佳方式是什么?

【问题讨论】:

  • 嗯,第二个版本?
  • 性能甚至不是一个考虑因素。您似乎没有考虑到 JIT...此外,您的单例代码不是线程安全的。
  • 在第一个解决方案中,我们需要一个实例,但在第二个解决方案中不需要,不是吗? @fge
  • @HoussemBdr,就目前而言,在第一种情况下您也不需要实例,因为该字段也是公共静态的。

标签: java singleton constants


【解决方案1】:

第二种选择(一个普通的公共最终静态字段)更简单,而且很可能更有效。

如果您发现自己需要更灵活的解决方案,我建议您创建一个枚举来保持您的价值观。

public enum MyConstants {
    CST1(new Image("someImage.jpg")),
    CST2(new Image("someOtherImage.jpg"));

    public final Image img;

    private MyConstants(Image img) {
        this.img = img;
    }
}

请注意,静态字段和枚举解决方案都可以优雅地与静态导入一起使用:

import static pkg.B.cst;           // usage:  cst

import static pkg.MyConstants.*;   // usage:  CST1  or  CST2

【讨论】:

  • 或属性文件。
  • 这些值是图像。
  • 但这一点不清楚:new copy of the constants each time they are accessed,
  • 没有理由不能从属性文件加载图像的路径...而不是将它们硬编码为常量(如果你想更灵活的话)。
  • @HoussemBdr,每次调用 A.getDefault() 都会创建一个新的 A 对象。查看代码,您可能打算将实例变量设为静态。
【解决方案2】:

性能差异可能无法衡量。我更喜欢第二个。你也可以用import static点赞

import static B.cst;

那么你可以直接使用cst。最后,我建议你把它全部大写CST

【讨论】:

    【解决方案3】:

    越简单越好。如果它只是一个常数,那么您不需要比直截了当的public static final String cst = "sample"; 更花哨的东西。

    【讨论】:

      【解决方案4】:

      虽然简单一点就够了,但是你可以添加一个私有构造函数。这有两个优点。首先,没有人可以创建 B 的实例。第二个更重要的好处是没有人可以扩展 B。因此 B 只是您项目中的一个常量值类。

      【讨论】:

        猜你喜欢
        • 2013-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-28
        • 1970-01-01
        • 1970-01-01
        • 2017-04-21
        • 2017-08-06
        相关资源
        最近更新 更多