【问题标题】:Quick Java Question: Instantiating a given class only from another?快速 Java 问题:仅从另一个类实例化给定类?
【发布时间】:2009-01-02 01:37:36
【问题描述】:

因此,我的问题是:我需要一种方法来确保只有一个给定的类可以实例化另一个。我不想让另一个嵌套的内部类或类似的东西。我该怎么做呢?我一下子忘记了。

【问题讨论】:

    标签: java class instantiation


    【解决方案1】:

    私有静态内部类正是您想要的。没什么好说的。

    public class Creator {
      private static class Created {
      }
    }
    

    否则只能在包级别保护实例化。

    public class Created {
      Created() {
      }
    }
    

    只允许来自同一个包的类访问构造函数。

    【讨论】:

    • Java 肯定不希望我这样做。 :P
    【解决方案2】:

    将构造函数设为私有。创建一个静态工厂方法,该方法采用允许访问的类的实例。让工厂方法创建一个合适的对象,并在允许访问创建的对象的对象上使用设置器,为该类提供创建的副本。

    public class AllowedAccess
    {
        private SecureClass secure;
        public setSecureClass( SecureClass secure )
        {
            this.secure = secure;
        }
    
        ...
    }
    
    public class SecureClass
    {
         private SecureClass() {}
    
         public static void Create( AllowedAccess allowed )
         {
              allowed.setSecureClass( new SecureClass() );
         }
    
         ...
    }
    

    顺便说一句,我对这种设计持怀疑态度。对我来说似乎耦合度太高了。

    【讨论】:

    • 要么就是这样,要么最终得到一个上帝类。
    • 颤抖。这很有创意,但很疯狂!
    • 我同意,但这不是我的要求。 :-)
    • 是的,一团糟。我仍在努力思考良好实践,但我的首要任务仍然是首先取得成果。
    【解决方案3】:

    您可以将要防止实例化包保护的类设为私有。

    【讨论】:

      【解决方案4】:

      我同意 tvanfosson 的回答,也同意他关于耦合太高的评论。为什么不通过采用SpringGuiceInversion of Control 框架来保留对类创建过程的更多控制?

      恕我直言,使用“new”语句创建类被认为有点......过时了,工厂将是首选,IoC 框架甚至更多。

      问候

      【讨论】:

      • 我认为这是一个相当狭隘的观点,如果不是幼稚的话。创造模式有它们的位置,工厂通常是好的。国际奥委会可能有它的位置,但它永远不会取代新的。 没有什么会像 A a = new A();所以说它过时是荒谬的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多