How to implement Constants in Java
把Constants类容器内的类中的常量分组,像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public final class Constants {
public final class File {
public static final int MIN_ROWS = 1;
public static final int MAX_ROWS = 1000;
private File() {}
}
public final class DB {
public static final String name ="oups";
public final class Connection() {
public static final String URL ="jdbc:tra-ta-ta";
public static final String USER ="testUser";
public static final String PASSWORD ="testPassword";
private Connection() {}
}
private DB () {}
}
private Constants () {}
} |
它允许使用Constants.DB.Connection.URL而不是DbConnectionConstants.URL。
- 分组有时有助于清晰。public class Constants { private static final class KeyOffsets { public static final int QTY = 0; //8-bytes (long) public static final int PRICE = 8; //8-bytes (long) } public static class Offset { public static final int Action = 16; } }
- stackoverflow.com/questions/66066/…的可能重复
- 由于我不喜欢我的代码对我大喊大叫,也不喜欢用COBOL编程,所以我倾向于使用pascalcase作为常量!!!!!!!!!!
我通常喜欢把常数在哪里他们属于类。例如,文件可以在FileManager常数(或什么),他们都在使用。连接DBUtil常数可以在你的类,他们都在使用。
想想JDK。是有一个gigantic常数级的?NO的常数。由(和使用)在BorderLayoutBorderLayout是一流的。使用的常量(和一个由一JOptionPaneJOptionPane)。
- 如果一个常量只在一个集中的地方使用一次,我同意这种方法。但是,它可能无法在更复杂的实现中工作。
优点:
你得到一个很好的"路径"的常数。
你会得到一个跨编码常数会议,如果colleages跟随指导。
缺陷:
有许多许多的"域"(常数常数,这类可能太麻烦的一个句柄。
它不是直观的。它让我想起了更多的蚂蚁比Java属性的常数。
它modularization防止您的代码。你说你想单独的数据库连接文件处理包和包是由不同的瓶可能是使用不同的应用程序。它提供的冗余管理JAR文件处理一个常数dB。你可以有很多的模块可以很容易地搜索。
在的结论,它的东西,可能只是一些小的手机,当你写你自己的自我应用研究。通常,它不是一个好的做法。
你可以使用一.properties foo.bar.bazclasspath文件中使用的符号。这将使它更容易recompiling值没有改变。Spring框架提供的工具,以帮助刷新值对飞。
然而,我同意,"Nizet和JB"是这一类的保鲜与最相关的常数是一个更好的主意。
使用枚举docs.oracle.com http://////javaoo JavaSE教程Java / enum.html
每个JVM都只有一个副本的枚举对象
- 如何在枚举中存储数据库服务器密码?
- instance;public final password="abcd";
- 即使这样也行,这是对enum的滥用。此外,您的论点还表明,常量String不受JVM的约束。
- 你是对的。只有一个字符串对象的副本。使用枚举只是封装事物的一种方法。您认为使用枚举作为实现单例模式的方法怎么样?你认为这是滥用吗?
你可以使用abstract为常数级太,甚至比在私有构造函数。如果你使用的界面会在外面和一个层次重复使用类可以简单的使用implements虽然隐藏的起源(接口名称)。
一个问题,虽然。如果你只有一个常数A类进出口,编译器可以把导入的类和在填充在常数本身。如果一个变化的时间常数的值,使用类不会自动recompile和保持旧的价值。
- 常量接口(或抽象类)通常被视为反模式。静态导入被引入,以便在不使用反模式的情况下具有相同的优势。你关于进口的评论毫无意义。导入仅在编译时使用。它们不在类文件中。无论导入与否,常量始终是内联的。
- @jbinzet-yes接口是反模式的,因此"虽然隐藏了源代码"。在导入时:导入的类名通常出现在已编译类的常量池中;对于上述情况则不是这样。但我同意,我称之为编译器特定的bug。