Java 静态初始化是好的编程实践吗?
在Java中,我们使用静态初始化块:Java 静态初始化是好的编程实践吗?,java,static,initialization,Java,Static,Initialization,在Java中,我们使用静态初始化块: private static final ApiKey API_KEY; static { API_KEY = new ApiKey(); } 我想知道 这是一个好的编程实践吗 我们应该在哪里使用这种模式 提前谢谢。在某种程度上,这是口味的问题。对我来说,只要: 就像你做的那样,你要保持场地决赛 确保引用的对象不可变且线程安全 静态倾向于使编写好的测试变得更加困难。如果您发现您想要开始修改静态,那么您可能需要再次查看设计 考虑一下看一看,
private static final ApiKey API_KEY;
static {
API_KEY = new ApiKey();
}
我想知道
- 这是一个好的编程实践吗
- 我们应该在哪里使用这种模式
提前谢谢。在某种程度上,这是口味的问题。对我来说,只要:
- 就像你做的那样,你要保持场地决赛
- 确保引用的对象不可变且线程安全
private static final ApiKey API_KEY = new ApiKey();
但这并不总是可能的。也许您省略了一些更复杂的初始化代码?在这种情况下,Guice再次值得一看。您可以通过使用以下代码完全避免使用静态初始值设定项块:
private static final ApiKey API_KEY = new ApiKey();
或
如果API密钥创建需要的不仅仅是构造函数调用。这使得代码更具可读性,IMHO。但这并不重要
当两个静态字段依赖于相同的初始化代码时,静态初始值设定项很有用:
static {
// compute some values
A = somePartOfTheComputedValues();
B = someOtherPartOfTheComputedValues();
}
但即使这样,A和B也可能被重构成一个对象,而这个对象将在一个方法中创建。我喜欢尽可能使用枚举 而不是
class ApiKey {
private static final ApiKey API_KEY;
static {
API_KEY = new ApiKey();
}
我会写
enum ApiKey {
INSTANCE;
我将发表评论,因为你的问题没有“黑或白”的答案。就我个人而言,我并不认为静态访问器是程序员的好朋友。依赖项注入是一个非常好的替代方案,在测试方面也有很大帮助。我见过一段代码,其中新线程在静态块中启动。:)非常糟糕。
enum ApiKey {
INSTANCE;