【问题标题】:How to prevent other classes to create instance of one class?如何防止其他类创建一个类的实例?
【发布时间】:2014-07-13 08:47:37
【问题描述】:

我的案例由三个类组成,即 SourceFactory、Source 和 SourceTypeI。我只想在 SourceFactory 中创建 SourceTypeI 的实例。换句话说,除了 SourceFactory,没有任何类可以创建 SourceTypeI 的实例。如何防止其他类可以创建 SourceTypeI?

预期用途;

  SourceFactory sF = new SourceFactory();
  Source source = sF.createSource();

  // from there, I should reach methods of SourceTypeI via source
  source.whoIs();

类

  |-------------|           |-----------------------|
  |SourceTypeI  |           |SourceFactory          |
  |-------------|           |-----------------------|
  |+whoIs():void|           |+createSource():Source |
  |             |           |                       |
  |-------------|           |-----------------------|

  |-----------------------------|
  |    Source                   | <- Source cannot be instantiated, it is used just a 
  |-----------------------------|    for referencing instance of SourceTypeI 
  |                             |
  |-----------------------------|

【问题讨论】:

  • 要限制的是Source(如代码所示)还是SourceTypeI(如文中所说)?

标签: java oop object-oriented-analysis


【解决方案1】:

如果我理解您的问题,您可以将SourceFactory 和SourceTypeI 放在同一个包中。然后将SourceTypeI 设为最终状态。接下来给出SourceTypeI 包级(默认)构造函数。

SourceTypeI() { // <-- not public, not private, not protected.
  super();
}

然后不要将“任何其他类”放入该包中。

【讨论】:

  • 我应该在其他两个类中做什么,以便我可以通过 Source 类访问 SourceTypeI 方法?还是我需要写点什么?
  • @Zmavus 公开SourceTypeI 方法,而不是构造函数!
【解决方案2】:

抱歉更改名称。

public interface Restricted { // Source
    public int getX();
}

public class Restrict {  // SourceFactory
    private class RestrictedImpl implements Restricted {
        public int getX(){ return 42; }
    }

    public Restricted createRestricted(){
        return new RestrictedImpl();
    }
}

Restrict restrict = new Restrict();
Restricted restricted1 = restrict.createRestricted();

【讨论】:

  • 感谢您的回答。 RestrictedImp 类是否可以拥有自己的文件,因为 RestrictedImpTypeII 可能需要实现。如果我把这两个类放在 Restrict 中,整体代码质量会下降。
  • 使用 Java 可以实现的可见性限制是有限的。 Elliots 回答提到包裹可能是您必须走的路。 - OTOH,您可以将 Source/Restricted 的另一个实现包装到另一个包装器中,并且仍然有一个工厂将 createXyz 委托给各个包装器,因此客户不会受到影响。
  • java中有没有类似C++ friend关键字的东西?可能,我可以用类的朋友方法来实现。
猜你喜欢
  • 2015-06-09
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
相关资源
最近更新 更多