在Java中调用默认构造函数和超级构造函数

时间:2016-07-05 10:59:24

标签: java inheritance constructor super

我猜我想要的东西根本不可能,但我想确定一下。说我有

allowLeaves

和扩展名

public class bar {
    public bar() {

    }
    public bar(Object stuff) {
         // something done with stuff.
    }
}

如何使foobar(Object stuff)尽可能简单,同时避免重复代码?我不能简单地称之为超级(东西),而是另外一些foobar逻辑"没有完成,我不能打电话给这个()因为那时我不会做我想做的事情"东西"。

注意: 我意识到在这种情况下我实际上并不需要这样做,所以现在这只是出于理论目的。

2 个答案:

答案 0 :(得分:5)

您只能链接到一个构造函数。通常,最好的方法是针对"不太具体的"构造函数(参数较少的构造函数)链接到"更具体的"有一个"主人"构造函数是唯一具有逻辑的构造函数:

public class FooBar extends Bar {
    public FooBar() {
        this(null); // Or whatever value you want for "stuff"
    }

    public FooBar(Object stuff) {
        super(stuff);

        // Initialization logic
    }
}

答案 1 :(得分:2)

如果添加一个显式的init()函数,它可能会导致更清晰的代码,这个函数封装了你想在构造函数之间共享的东西。特别是在您的情况下,您尝试在构造函数之间跳转。

在提供的答案中,super()构造函数未执行。虽然super()在您的示例中为空,但将来不一定如此。

此外,您依靠super(foo)正确处理foo == null。虽然为超类抛出IllegalArgumentException可能是完全可以接受的,但它不适合您的用例。您基本上是使用带参数的参数化构造函数来扩展合约以正确初始化超类。

使用init方法方法,减少了代码重复,超类没有扩展合同。不过,你可能不喜欢这种风格。构造函数链接避免了额外的方法。

public class foobar extends bar {
    public foobar() {
        super();
        initFooBar(null);
    }

    public foobar(Object stuff) {
        super(stuff);
        initFooBar(stuff);
    }

    public void initFooBar(Object stuff) {
        // some additional foobar logic here.    
        // "something done with stuff" here.             
    }
}