代码之家  ›  专栏  ›  技术社区  ›  Joffrey

在构造函数中调用了Init块VS Init()私有方法

  •  1
  • Joffrey  · 技术社区  · 10 年前

    我知道有几种方法可以在Java中创建实例时初始化东西,但我对以下两种可能性之间的区别很感兴趣。

    案例1:

    {
        // common init code for all constructors
    }
    
    public MyType() {
        super();
        // specific init code
    }
    
    public MyType(Object arg) {
        super(arg);
        // specific init code
    }
    

    案例2:

    public MyType() {
        super();
        init();
        // specific init code
    }
    
    public MyType(Object arg) {
        super(arg);
        init();
        // specific init code
    }
    
    private void init() {
        // common init code for all constructors
    }
    

    我认为这两种情况在代码方面是等效的。我认为第一个更快,因为少了1个方法调用,但另一方面,对于不太了解初始化的人来说,这可能会让人感到困惑。

    有没有我错过的另一个差异会导致我们选择一个而不是另一个? 我应该首选哪个选项?

    注: init() 方法是私有的,我知道不同的可见性可能会导致初始化错误(在子类化时),这不是重点。

    2 回复  |  直到 10 年前
        1
  •  1
  •   Rohit Jain    10 年前

    也许第一个更快,因为方法调用少了1个,但我认为它可读性较差。

    我甚至不会考虑这里的效率,因为它只会对方法调用产生微小的影响。但为什么你认为它不那么可读?这是Java语言的一个众所周知的特性。

    我应该首选哪个选项?

    第一种方法的好处是,您必须编写更少的代码。在第二种方法中,人为错误的可能性很小。通常,当您希望在每个构造函数中完成初始化时,可以使用实例初始化器块。这就避免了在所有构造函数中显式地编写相同的代码。对于另一种方法,您必须记住调用 init() 方法。

    但是如果您希望某些初始化成为某些构造函数的一部分,那么第二种方法可能会有用。但这是非常罕见的IMO。

        2
  •  0
  •   Community CDub    7 年前

    简而言之,第一种情况下的init代码将在构造函数之前调用,在第二种情况下调用。 看看这个 question .

    一般规则是避免使用和使用这样的结构 static-factory-methods 相反

    如果调用this()而不是super(),顺序可能很重要: 考虑代码:

    public class InitOrderTest {
    static class Super {
        Super() {
            System.out.println("Super constructor");
        }
    }
    static class Puper extends Super {
        {
            System.out.println("Code block");
        }
        Puper() {
            this("Self constructor");
            init();
        }
    
        public Puper(String inner) {
            System.out.println(inner);
        }
    
        private void init() {
            System.out.println("Init call");
        }
    }
    public static void main(String[] args) {
       new Puper();
    }
    

    }

    它打印:

    Super constructor
    Code block
    Self constructor
    Init call