从静态块调用静态方法

时间:2015-04-13 04:13:56

标签: java static

我想知道从静态块调用静态方法来初始化静态变量有什么问题,即我可以使用

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中的代码也是可重用的,因此应该是可重用性的良好决策。我只是觉得我遗漏了一些东西,没有提到在任何地方从静态块调用静态方法,这就是为什么我认为这是一个不好的做法

5 个答案:

答案 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
相关问题