2

假设我有一个名为Factory. 我打算让该类公开访问,以便任何人都可以创建和访问factory. 我希望工厂创建和分发widgets. 我只希望工厂能够创建widgets,而不是公共程序空间中的任何人。但是,我想要一个调用的方法,它会向主程序distribute()发出 a 。widget那时主程序可以访问所有的公共方法widget。如果需要,它还可以将其返回工厂,从而删除对该对象的任何公共访问。

如果这是可能的,如何做到这一点?

4

3 回答 3

4

你正在寻找的是一个内部类。通过将内部类的构造函数声明为private,只有封装类才能访问!然后在外部类中创建一个工厂方法来构建小部件并分发它。我已经在static这里声明了,但这不是必需的,具体取决于您的需要。

public class Factory {

  public static Widget buildWidget() {
    Widget widget = new Widget();
    return widget;
  }

  public class Widget {
    private Widget() { ... }
    public void someMethod() { ... }
  }
}

请注意,在干净的代码中,您必须通过注意引用完整性来解决您的其他问题。要“归还”小部件,必须释放对它的所有其他引用。您的工厂当然可以跟踪它发出的小部件,但是很难可靠地“召回”小部件。

于 2012-07-04T01:05:17.797 回答
1

您正在描述随时间变化的访问控制(“如果需要,它也可以将其返回工厂,从而删除对该对象的任何公共访问。”)。Java 不是那样工作的。所有访问限定符都经过静态检查,并在程序的整个生命周期内保持不变。

于 2012-07-04T01:03:45.157 回答
0

将小部件放在与工厂相同的包中,并将小部件的构造函数设置为具有受保护的可见性。这会将对象的创建限制在工厂中。

对于每个小部件,可以部分实现访问控制。您可以在允许访问的 Objects 的每个小部件中保留一个 List,并且只有工厂可以修改此列表(受保护的可见性)。对于所有公共功能,您需要用户传入一个已被授权访问小部件功能的对象。您可以通过将已授权的对象传递回工厂来返回该对象,以便工厂删除授权。

您可以将主类中的私有对象作为授权对象传递 - 这将阻止其他类使用小部件。但是,这并不妨碍其他类请求授权。

这有点不稳定,因为您可能忘记释放授权并使用“不死对象”使小部件混乱(除了小部件中的访问控制列表外,其他任何地方都没有使用)。

于 2012-07-04T01:19:48.830 回答