2012-02-29 33 views
1

是否有可能从同一个类的另一个构造函数中调用构造方法的结果?构造函数链中的Java方法调用

我希望能够接受多种形式的输入,并有类似:

public class MyClass 
{ 
    public MyClass(int intInput) 
    { 
    ... 
    } 

    public MyClass(String stringInput); 
    { 
     this(convertToInt(stringInput)); 
    } 

    public int convertToInt(String aString) 
    { 
     return anInt; 
    } 
} 

当我尝试编译,我得到

error: cannot reference this before supertype constructor has been called 

指的convertToInt

+0

我不建议在构造函数中调用方法;对象构建应该是快速和简单的。也许包含一个'init()'方法? – mre 2012-02-29 19:38:32

回答

4

你只需要使convertToInt静态。由于它并不真正依赖于类实例中的任何内容,因此它可能并不属于这个类。

下面是一个例子:

class MyClass { 
    public MyClass(String string) { 
     this(ComplicatedTypeConverter.fromString(string)); 
    } 

    public MyClass(ComplicatedType myType) { 
     this.myType = myType; 
    } 
} 

class ComplicatedTypeConverter { 
    public static ComplicatedType fromString(String string) { 
     return something; 
    } 
} 

你必须这样做,这样一来,因为在幕后,需要的是运行自己的构造函数之前被称为超级构造函数(在这种情况下,对象)。通过参考this(通过方法调用)之前,发生了对​​的无形呼叫,您违反了语言约束。

参见the JLS第8.8.7和more of the JLS第12.5节。

+0

谢谢!我意识到,就像我发布这个问题一样,所以我认为我会继续,并自己回答。我不只是复制你的答案,诚实! – DenverCoder8 2012-02-29 19:32:57

+0

呵呵 - 没问题。 :) – alpian 2012-02-29 19:36:25

+0

这是我的代码的简化版本,没有用于我需要做的转换的库函数。 – DenverCoder8 2012-02-29 19:37:16

2

无法调用方法convertToInt,因为它需要由对象运行,而不仅仅是来自类。因此,将代码更改为

public static int convertToInt(String aString) 
{ 
    return anInt; 
} 

表示构造函数完成之前的convertToInt

0

没有它不可能。要调用实例方法,你所有的超类构造函数都必须被调用。在这种情况下,您正在调用this()来替换对super()的调用。你不能同时使用super()和this()。所以超类实例在你的情况下没有初始化,因此你得到这个错误。

你可以这样调用

public MyClass(String stringInput) { 
    super(); // No need to even call... added just for clarification 
    int i = convertToInt(stringInput); 
} 

制作方法静电可能会解决你的问题。

+0

从构造函数中调用另一个构造函数是完全正确的。请参阅[我如何从Java中调用另一个构造函数?](http://stackoverflow.com/questions/285177/how-do-i-call-one-constructor-from-another-in-java) – 2012-02-29 20:04:18

+0

我从来没有说你不能调用其他的构造函数。它非常好。我说过你不能在同一个构造函数中同时调用this()和super()。 – JProgrammer 2012-02-29 20:15:39

+0

这很混乱。我不认为他问这样的问题。 – 2012-02-29 21:06:28