【问题标题】:Preventing class instantiation from other classes防止其他类的类实例化
【发布时间】:2015-06-09 13:23:35
【问题描述】:

我正在使用域、视图和控制器。每个都包含自己的类。

域包含许多不应在域外的类中实例化的类。我的印象是默认访问修饰符会帮助我。使我的域类的构造函数包可见。

事实证明,任何类在导入正确的 package.class 文件后仍然可以使用构造函数。

如何防止这种情况发生?

【问题讨论】:

标签: java class oop design-patterns instantiation


【解决方案1】:

当您说“在导入正确的 package.class 文件后,任何类仍然可以使用构造函数。”我猜你在谈论反射。 反射是一个强大的概念,允许任意实例化类,即使它们只提供私有构造函数。 没有办法阻止某人使用反射来实例化您的类。可以使用反射绕过类或构造函数修饰符,例如 private 或 protected。

【讨论】:

  • 似乎将类的访问修饰符声明为包可见解决了我的问题。感谢您的意见!
  • 使用 Class.forName("package.subpackage...className") 您仍然可以获得包私有类的 Class 对象。通过这种方式,您可以获得声明的构造函数,使其可访问,然后调用它们,为您提供所需类的实例。
【解决方案2】:

如果你想从类外部控制一个类的实例化,那么你可以创建它的构造函数private like -

class A{

   private A(){
      // do some thing
   } 

   public static getInstance(){

   }
}   

现在可以从类的外部创建类 A 的实例。但是如果外部世界真的需要一个类的实例,那么他们可以使用静态方法getInstance()。这种构造防止外部世界使用new 关键字创建类的实例。

希望它会有所帮助。
谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-11
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    相关资源
    最近更新 更多