我有两个构造函数,第一个构造函数创建一些过程,例如创建新对象,并且没有if \ for语句。并且此构造函数无法更改,甚至不能更改为私有。
但是第二个构造函数得到一个int值,其工作方式类似于 如果否定抛出异常 如果是肯定的,请做一些处理 但是如果num = 0以避免重复代码,我想调用第一个构造函数。
实现这种代码的正确方法是什么?请注意,这些构造函数在同一类中。
public class SomeClass{
public SomeClass() {
//Do some process
}
public SomeClass(int num) {
if (num == 0) {
this(); //here we have an issue
}
}
}
答案 0 :(得分:3)
创建某种工厂:
public class SomeClass
{
// This is the original constructor
public SomeClass()
{
// Do some process
}
// New constructor expecting num > 0
private SomeClass(int num)
{
// Do whatever you want
}
public static SomeClass getIt(int num) throws Exception
{
if (num < 0)
throw new Exception("...");
else if (num > 0)
return (new SomeClass(num));
else
return (new SomeClass());
}
} // SomeClass
答案 1 :(得分:2)
对另一个构造函数(this();
)的调用必须首先在该构造函数中进行。
您可能希望重构代码,将“处理”逻辑放入方法中:
public Constructor() {
this.processConstructor();
}
public Constructor(int num) {
if(num == 0) {
this.processConstructor();
}
}
private void processConstructor() {
//Do some process
}
答案 2 :(得分:0)
反过来做:
public class SomeClass{
public SomeClass() {
this(1 /* or some sensible default */);
}
public SomeClass(int num) {
// Do stuff.
}
}
作为一般原则,您应该只具有一个实际上“有用的东西”的构造函数。然后,其他重载仅存在以提供合理的默认值来调用该构造函数。