java中的一个类可以控制另一个类中的对象吗?

时间:2012-07-04 00:59:38

标签: java

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

如果可以的话,如何实现这一目标?

3 个答案:

答案 0 :(得分:4)

你正在寻找的是一个内在阶级。通过声明内部类的构造函数private,只有封装类才能访问它!然后在外部类中创建一个工厂方法来构建窗口小部件并进行分发。我已在此处声明static,但根据您的需要,这不是必需的。

public class Factory {

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

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

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