【问题标题】:When are initializer blocks used in java? [duplicate]java中什么时候使用初始化块? [复制]
【发布时间】:2016-05-30 00:25:46
【问题描述】:

我读到初始化程序块是“一个未命名的代码块,其中包含初始化类的代码?

例如:

class A {
  final int x;
  final int y;
  final String n;

{ 
    x = 10;
    y = 20;
}

public A(String name ) {

/* etc... etc */

我从未见过使用过这种类型的代码,所以我想知道它在哪里可能有用。为什么不直接在构造函数中初始化变量呢?

谢谢

【问题讨论】:

    标签: java initializer


    【解决方案1】:

    我认为有时在定义变量时立即对其进行初始化会有所帮助。

    public class Stooges {
      private ArrayList<String> stooges = new ArrayList<>();
      { stooges.add("Lary"); stooges.add("Curly"); stooges.add("Moe"); }
    
      // ... etc. other methods.
    }
    

    该初始化程序现在对所有构造函数都是通用的,因此它避免了代码重复。您可以使用私有方法并从所有构造函数中调用类似的代码,但这种方式甚至可以避免记住插入方法调用。减少维护!

    可能还有其他例子。如果初始化程序代码调用一个引发异常的方法,那么您不能只分配它。您必须捕获异常。

    【讨论】:

      【解决方案2】:

      一个常见的用法是static initializer block

      class A {
          static boolean verbose;
          final int x;
          final int y;
          final String n;
      
      static { 
          verbose = doSomethingToGetThisValue();
      }
      
      public A(String name ) {
      
      /* etc... etc */
      

      这很有用,因为在创建类的实例之前(因此在调用构造函数之前),静态方法可能会使用静态变量。

      另见this SO answer

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-16
        • 2012-03-11
        • 2013-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多