我有一个带有两个不同构造函数的对象:
public class MyClass {
public MyClass(arg1, arg2) {
//constructor
}
public MyClass() {};
}
我只需要通过我的软件的特定类调用第二个(第一个可以在任何地方调用)。是否有针对此案例的设计模式?
MyClass
和调用类在两个不同的包中,因此包私有构造函数不是解决方案。
答案 0 :(得分:3)
没有设计模式,可以用一种方式完成。设置一个构造函数public,它将从所有类调用。另一个声明它包私有。现在将此类和具体的内容放在同一个包中。
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);
N.B ..我只是忽略了这些论点。您可以使用createMyClass
方法传递参数。
答案 1 :(得分:1)
你可以这样做。
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!
}
}