Java 调用构造函数的设计模式
我有一个具有两个不同构造函数的对象:Java 调用构造函数的设计模式,java,design-patterns,constructor,Java,Design Patterns,Constructor,我有一个具有两个不同构造函数的对象: public class MyClass { public MyClass(arg1, arg2) { //constructor } public MyClass() {}; } 我只需要通过软件的特定类调用第二个(第一个可以在任何地方调用)。是否有针对这种情况的设计模式 MyClass和调用类位于两个不同的包中,因此包私有构造函数不是解决方案。如果没有设计模式,可以通过一种方式完成。设置一个构造函数public,它将
public class MyClass {
public MyClass(arg1, arg2) {
//constructor
}
public MyClass() {};
}
我只需要通过软件的特定类调用第二个(第一个可以在任何地方调用)。是否有针对这种情况的设计模式
MyClass
和调用类位于两个不同的包中,因此包私有构造函数不是解决方案。如果没有设计模式,可以通过一种方式完成。设置一个构造函数public,它将从所有类调用。另一个声明它是包私有的。现在将这个类和特定的on放在同一个包中
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,它将从所有类调用。另一个声明它是包私有的。现在将这个类和特定的on放在同一个包中
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!
}
}
你可以这样做
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!
}
}
我知道,但我会从另一个包中的类调用它(我不能从他的包中移动该类:))4在另一个选项中,
publicMyClass(){}
应该是包私有的
。是的,它可以工作:)我刚刚修改了您的通用代码,使其适合我的具体情况。谢谢我不确定我在野外见过你的第二个图案。这是你刚刚发明的吗?@DuncanJones lol不。。这不是任何常见的模式。。。我刚体验过工厂的概念。。这里只有一些rougn代码。。。请建议您是否有更好的解决方案:)我知道,但我会从另一个包中的类调用它(我无法将该类从他的包中移动:))4在另一个选项中,public MyClass(){}
应该是包私有的
。是的,它可以工作:)我刚刚修改了您的通用代码,使其适合我的具体情况。谢谢我不确定我在野外见过你的第二个图案。这是你刚刚发明的吗?@DuncanJones lol不。。这不是任何常见的模式。。。我刚体验过工厂的概念。。这里只有一些rougn代码。。。请建议您是否有更好的解决方案:)这里可能有设计的味道。需要两个不同的构造函数可能表明它实际上不是您想要在两个包中操作的同一个对象,或者您可能需要第三个执行上下文更敏感的对象来实例化带有相关arg1和arg2的MyClass
,并将其传递给package1或Package2。这里可能有设计气味。需要两个不同的构造函数可能表明它实际上不是您想要在两个包中操作的同一个对象,或者您可能需要第三个更具执行上下文意识的对象来实例化带有相关arg1和arg2的MyClass
,并将其传递给package1或Package2。