1

我有一个具有两个不同构造函数的对象:

public class MyClass {
   public MyClass(arg1, arg2) {
       //constructor
   }

   public MyClass() {};

}

我只需要通过我的软件的特定类调用第二个(第一个可以在任何地方调用)。是否有针对这种情况的设计模式?

MyClass并且调用类位于两个不同的包中,因此包私有构造函数不是解决方案。

4

2 回答 2

3

如果没有设计模式,它可以以一种方式完成。设置一个公共的构造函数,它将被所有类调用。而另一个声明它包私有。现在将这个类和特定的放在同一个包中。

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您可以在方法中传递参数。

于 2013-07-01T14:50:22.187 回答
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!
    }
}
于 2013-07-01T15:04:05.337 回答