从静态块中调用静态方法

4
我想知道是否可以在静态块中调用静态方法以初始化静态变量。例如,以下代码是否可行:
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代码也是可重用的。我感到自己漏掉了一些东西。从静态块调用静态方法没有被提及,这就是我认为这是不好的做法的原因。

1
当然可以。你尝试过了吗? - user207421
5个回答

0

静态块在类创建时只调用您的方法一次,如果您想在类创建时调用方法,可以调用它。

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


0

这与设计或最佳实践无关。

无论如何,建议将代码/功能块分成不同的函数,并使它们静态并从静态块调用是您的应用程序在JVM加载类时要求的内容。

静态方法的优点是如果需要,它们可以在以后被重复使用。因此,与相应的静态初始化块相比,静态方法具有更高的灵活性。

了解更多信息here


0

在静态块中调用静态方法是可以接受的,特别是当你只想在JVM第一次初始化类时执行所引用的静态方法的内容一次时。此外,请记住该静态块不会再次执行,即使您在应用程序中创建了相同类型的多个对象,除非第一次创建。

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


0

你可以这样做。但出于几个原因,这不是最好的想法。

首先,你已经将类硬编码到静态方法正在读取的任何属性文件中,这会使测试变得复杂。如果没有实际的文件存在,你无法对该类进行测试。

另一个问题是,在静态块中处理异常是有问题的,因为没有办法处理从静态块抛出的未检查异常。请参见为什么Java不允许从静态初始化块中抛出已检查的异常?。你必须专门捕获块中的所有内容,而错过的任何内容都无法在应用程序中任何地方被捕获。

依赖注入框架将处理将此内容注入到你的类中,以便更轻松地进行测试并避免异常处理问题。


0
一些关于静态块的额外说明可能会对某些人有所帮助。
只有在以下情况下才接受在静态块中调用静态方法。
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或以下,则即使没有主方法,它也可以正常工作。

示例:

// 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

所有这些与静态块或方法无关。 - user207421
只是提供了额外的信息。 - KarthikaSrinivasan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接