从静态块调用静态方法



我想知道是否可以从静态块调用静态方法来初始化静态变量。例如,可能出现以下情况:

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 parser properties
    }
    //  Further methods omitted
}

这是好的做法吗?

编辑:Oracle 建议按如下方式进行初始化:

class Whatever {
    public static VarType myVar = initializeClassVariable();
    private static VarType initializeClassVariable() {
        // Initialization code goes here
    }
}

他们的解释是:

私有静态方法的优点是它们可以重用 稍后,如果需要重新初始化类变量。

但是,AppProperties代码也是可重用的。我有一种感觉,我错过了什么。没有提到从静态块调用静态方法,这就是为什么我认为这是不好的做法。

Static块在创建类时只调用一次方法,如果要在创建类时调用方法,可以调用它。

Static块是在创建类时调用静态方法的唯一方法。

这不应该是与设计或最佳实践相关的任何问题。

无论如何,建议将代码/功能块划分为不同的函数,并且使它们static and calling from static block是应用程序在按JVM加载类时需要的。

static methods的优点是,如果需要,以后可以重复使用它们。因此,与相应的static initialization block相比,您可以使用static method获得更大的灵活性。

欲了解更多信息,请点击此处

从静态块调用静态方法,如果您确实希望在第一次在 JVM 中初始化类时只执行一次引用的静态方法中的内容,这是可以接受的。此外,您必须记住,即使您在应用程序中创建了多个相同类型的对象,除了第一次创建之外,此静态块也不会再次执行。

但是,如果需要将任何值与其他对象创建周期一起使用,则必须使用静态变量来存储。

关于静态块的一些额外要点可能会对某人有所帮助。

仅在以下条件下接受在静态块内调用静态方法。

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
你可以

这样做。但由于几个原因,这不是最好的主意。

一个是你已经将类硬连接到静态方法正在读取的任何属性文件,使测试复杂化。如果没有实际文件,则无法练习该类。

另一个是静态块中的异常处理

是有问题的,无法处理从静态块引发的未经检查的异常。请参阅为什么 Java 不允许从静态初始化块中抛出已检查的异常?。您必须专门捕获来自块的所有内容,并且错过的任何内容都无法在应用程序中的任何位置捕获。

依赖注入框架将为您处理将这些内容注入到您的类中,并且更容易测试并且没有异常处理问题。

最新更新