构造函数链接没有这个()

时间:2016-04-07 13:11:07

标签: java constructor

我知道构造函数链是从最小的构造函数到最大的构造函数。例如

    public MyChaining(){
        System.out.println("In default constructor...");
    }
    public MyChaining(int i){
        this();
        System.out.println("In single parameter constructor...");
    }
    public MyChaining(int i,int j){
        this(j);
        System.out.println("In double parameter constructor...");
    }

另据我了解,this()super()的来电必须在第一行。但绕过那个限制和链构造函数是否有可能(如果是,是否有效)?

例如,我有两个共享一些代码的构造函数。

    public Location(String _Name) throws IOException, JSONException {
        //Three lines of unique code (must be executed before the shared code)
        //Shared code
    }

    public Location(JSONObject json) {
        //Shared code
    }

第一个构造函数以任何方式调用第二个构造函数吗?

4 个答案:

答案 0 :(得分:4)

不确定。如果您有static功能

JSONObject foo(String)

然后你可以写

public Location(String _Name) throws IOException, JSONException {
    this(foo(_Name));
}

答案 1 :(得分:3)

在不调用this的情况下运行共享代码的唯一方法是两个构造函数都调用一些包含共享代码的初始化方法。

public Location(String _Name) throws IOException, JSONException {
    //Three lines of unique code (must be executed before the shared code)
    init ();
}

public Location(JSONObject json) {
    init (); // perhaps the JSONObject should be passed to that method, otherwise
             // that parameter is useless. On the other hand, I don't see a
             // JSONObject in the other constructor
}

private void init () {
    // shared code
}

答案 2 :(得分:1)

一个不同的答案:不要这样做。

构造函数就像你班上的任何其他成员一样 - 他们应该“完全”理解。拥有为用户提供完全“不同”或“独立”“接口”的构造函数对我来说就像代码味道。

你知道吗如果你能在你的班级“画”一条线;并且你发现左边有一些元素,而其他许多元素都出现在那条线的右边;那么这表明你可能应该沿着那条“线”拆分你的班级,而是创建两个班级。

如果你真的想从不同的上下文中创建相同类型的对象;然后尝试识别“共同分母X”;并提供一个完全相同的构造函数。然后使用工厂方法,可能以不同的方式使用该公共构造函数。这意味着您要么在同一个类中提供静态方法,比如

static Location generateLocationFromFoo(Foo foo) { ... }
static Location generateLocationFromBar(Bar bar) { ... }

或者更进一步,创建一个单独的工厂类,用于为您生成实际的Location对象。

答案 3 :(得分:1)

我发现从最小的构造函数到最大的模式的链接是非常难以理解的,因为实际的构造函数逻辑分布在许多不同的方法上。

我发现它最具可读性:

  • 有一个完全处理实例初始化的“主”构造函数
  • 让所有其他构造函数称之为

此外,我有点不喜欢长链接(如果从一个简单的构造函数向下钻取,很难找到实际的代码),所以我倾向于编写所有其他构造函数来直接调用“main”,除非它意味着重复代码。

你总是可以通过调用静态方法绕过“this()必须是第一个语句”限制,除非你试图做一些这个规则实际上试图阻止的东西(例如使用半初始化的对象) )。 请注意,被调用函数必须是静态的,以防止您使用半初始化对象。