【问题标题】:design pattern for invoke constructor调用构造函数的设计模式
【发布时间】:2023-03-05 22:43:01
【问题描述】:

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

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

   public MyClass() {};

}

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

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

【问题讨论】:

  • 这里可能有设计的味道。需要 2 个不同的构造函数可能表明它实际上不是您要在两个包中操作的同一对象,或者您可能需要第三个、更多执行上下文感知对象来实例化 MyClass 与相关的 arg1 和 arg2 并将其传递给包 1 或包 2。

标签: java design-patterns constructor


【解决方案1】:

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

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

【讨论】:

  • 我知道,但我会从另一个包中的类调用它(我不能从他的包中移动那个类:))4
  • 另一个选项中,public MyClass() {};应该是package-private
  • 是的,它有效:) 我刚刚修改了您的通用代码以使其适应我的具体情况。谢谢
  • 我不确定我是否见过你的第二个模式。这是你刚刚发明的东西吗?
  • @DuncanJones lol no ..这不是任何常见的模式......我只是从工厂的概念中体验过......这里只是一些粗略的代码......如果你有更好的解决方案,请建议:)
【解决方案2】:

你可以这样做。

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!
    }
}

【讨论】:

    猜你喜欢
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    相关资源
    最近更新 更多