【问题标题】:Call static method from static block [closed]从静态块调用静态方法[关闭]
【发布时间】:2015-04-13 04:13:55
【问题描述】:

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

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 代码也是可重复使用的。我有一种感觉,我错过了一些东西。没有提到从静态块调用静态方法,这就是为什么我认为这是不好的做法。

【问题讨论】:

  • 当然可以。当你尝试它时发生了什么?

标签: java static


【解决方案1】:

Static block 在类创建时只调用一次你的方法,如果你想在类创建时调用方法,你可以调用它。

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

【讨论】:

    【解决方案2】:

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

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

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

    更多信息here

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        仅在以下情况下才接受在静态块内调用静态方法。

        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
        

        【讨论】:

        • 这一切都与静态块或方法无关。
        • 刚刚提供了额外的信息。
        【解决方案5】:

        你可以这样做。但这不是最好的主意,有几个原因。

        其中一个原因是您已将类硬连接到静态方法正在读取的任何属性文件,这使测试变得复杂。如果没有实际文件,您将无法练习课程。

        另一个是静态块中的异常处理是有问题的,没有办法处理从静态块抛出的未经检查的异常。见Why doesn't Java allow to throw a checked exception from static initialization block?。您必须专门捕获从块中出来的所有内容,并且在应用程序的任何地方都无法捕获任何遗漏的内容。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-04
          • 1970-01-01
          • 2013-03-20
          相关资源
          最近更新 更多