[英]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.