我想知道从静态块调用静态方法来初始化静态变量有什么问题,即我可以使用
public class AppProperties {
private static final Logger logger = LoggerFactory.getLogger(AppProperties.class);
private static final String PARSER_PROPERTIES_FILE = "/parser.properties";
private static final Properties PARSER_PROPERTIES = new Properties();
private static final Properties DAO_PROPERTIES = new Properties();
static {
loadParserProperties();
loadDaoProperties();
//some other configuration
}
public static void loadParserProperties() {
//loading...
}
...
}
可以练习吗?
编辑: Oracle说静态更好的方法就是这样初始化:
class Whatever {
public static varType myVar = initializeClassVariable();
private static varType initializeClassVariable() {
// initialization code goes here
}
}
说法
私有静态方法的优点是可以重用它们 稍后如果你需要重新初始化类变量。
然而,for AppProperties
中的代码也是可重用的,因此应该是可重用性的良好决策。我只是觉得我遗漏了一些东西,没有提到在任何地方从静态块调用静态方法,这就是为什么我认为这是一个不好的做法
答案 0 :(得分:0)
Static
阻止在创建类时只调用一次方法,如果要在创建类时调用方法,可以调用它。
Static
块只是在创建类时可以调用静态方法的方法。
答案 1 :(得分:0)
这不应该是与设计或最佳实践相关的任何问题。
无论如何,建议将代码/功能块分成不同的函数,并且在static and calling from static block
加载类时,将JVM
作为应用程序所需的内容。
static methods
的优势在于,如果您需要,可以在以后重复使用。因此,与相应的static method
相比,static initialization block
可以获得更大的灵活性。
了解更多信息here
答案 2 :(得分:0)
从静态块调用静态方法,如果你真的想在第一次在JVM中初始化类时,只想一次执行引用静态方法中的内容,那么它是可接受的。此外,您必须牢记这个静态块不会再次执行,即使您在应用程序中创建了与第一次创建相同类型的多个对象。
但是,如果需要在其他对象创建周期中使用任何值,则必须使用静态变量进行存储。
答案 3 :(得分:0)
您可以执行此操作。但这不是最好的主意,有几个原因。
一个是,您已经将类硬连接到静态方法正在读取的任何属性文件,这使测试变得复杂。没有实际的文件,您不能上课。
另一个是静态块中的异常处理是有问题的,无法处理从静态块引发的未经检查的异常。参见Why doesn't Java allow to throw a checked exception from static initialization block?。您将必须专门捕获从块中传出的所有内容,而错过的任何内容都无法在应用程序中的任何位置捕获。
依赖注入框架将为您轻松地将这些东西注入您的类中,并且没有异常处理问题。
答案 4 :(得分:-1)
关于静态阻止的一些其他要点可能会对某人有所帮助。
仅在以下情况下才能接受在静态块内部调用静态方法。
1)如果Java版本为7或更高版本,则必须包含main方法。否则它将抛出错误
Error: Main method not found in class MyClass, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application
2)如果Java版本为6或更低版本,即使我们没有main方法,它也可以正常工作。
示例:
// The below code would not work in JDK 1.7 and above
class staticExample {
// static block execution without main method in JDK 1.6.
static
{
System.out.println("Inside Static Block.");
System.exit(0);
}
}
输出:(在JDK 1.6中)
Inside Static Block.
但是从JDK 1.7开始,以上代码在输出中出现错误。
输出:
Error: Main method not found in class staticExample, please define the main method as:
public static void main(String args[])
or a JavaFX application class must extend javafx.application.Application