我有一个具有两个不同构造函数的对象:
public class MyClass {
public MyClass(arg1, arg2) {
//constructor
}
public MyClass() {};
}
我只需要通过我的软件的特定类调用第二个(第一个可以在任何地方调用)。是否有针对这种情况的设计模式?
MyClass
并且调用类位于两个不同的包中,因此包私有构造函数不是解决方案。
我有一个具有两个不同构造函数的对象:
public class MyClass {
public MyClass(arg1, arg2) {
//constructor
}
public MyClass() {};
}
我只需要通过我的软件的特定类调用第二个(第一个可以在任何地方调用)。是否有针对这种情况的设计模式?
MyClass
并且调用类位于两个不同的包中,因此包私有构造函数不是解决方案。
如果没有设计模式,它可以以一种方式完成。设置一个公共的构造函数,它将被所有类调用。而另一个声明它包私有。现在将这个类和特定的放在同一个包中。
public class MyClass {
public MyClass(arg1, arg2) {
//constructor
}
MyClass() {}; // only for the class in the same package
}
所以现在公共构造函数可以被所有人使用,而包保护构造函数只能被同一个包中的类调用。
另外的选择
您可以使用工厂模式的不同实现
public class MyClass {
public MyClass(arg1, arg2) {
//constructor
}
public MyClass() {};
}
还有工厂
public class MyClassFactory{
public static MyClass createMyClass(Object o){
if (o instanceOf SpecificClass)
return new MyClass();
else
return new MyClass(arg1,arg2);
}
}
现在打电话
MyClass mC = MyclassFactory.createMyClass(this);
注意。我只是省略了论点。createMyClass
您可以在方法中传递参数。
你可以做这样的事情。
public class Test {
public Test() {
StackTraceElement[] stack = new Throwable().getStackTrace();
StackTraceElement topOfStack = stack[0];
if (!topOfStack.getClassName().equals("mypackage.MyClass"))
throw new SecurityException("Haha! You are not allowed to call me!");
// ....
}
public static void main(String[] args) {
new Test(); // Haha! You are not allowed to call me!
}
}