繁体   English   中英

没有this()的构造方法链接

[英]Constructor Chaining without this()

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

    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
    }

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

当然。 如果您有static功能

JSONObject foo(String)

然后你可以写

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

无需调用运行共享代码的唯一方法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
}

某种不同的答案:不要那样做。

构造函数与您班上的任何其他成员一样,应该“合计”。 让构造函数向用户提供完全“不同”或“独立”的“接口”的构造函数对我来说就像是代码的味道。

你看; 如果您可以在课堂上“画一条线”; 您会发现某些元素永远位于该行的左侧,而其他元素则位于该行的右侧。 这表明您也许应该沿着该“线”分割您的班级,而改为创建两个班级。

如果您真的想从不同的上下文中创建相同种类的对象; 然后尝试识别“公分母X”; 并为X提供确切的构造函数。然后使用工厂方法,这些方法可能以不同的方式使用该通用构造函数。 这意味着您可以在同一类中提供静态方法,例如

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

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

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

我觉得最容易理解:

  • 有一个“主”构造函数可以完全处理实例初始化
  • 让所有其他构造函数调用它

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

您总是可以通过调用静态方法来解决“ this()必须是第一条语句”的限制,除非您尝试执行该规则实际上试图防止的操作(例如,使用半初始化对象)。 请注意,被调用函数必须完全是静态的,以防止您使用半初始化的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM