假设我有一个名为Factory
的类。我打算让这个课程公开访问,这样任何人都可以创建和访问factory
。我希望工厂创建和分发widgets
。我只希望工厂能够创建widgets
,而不是公共程序空间中的任何人。但是,我希望有一个名为distribute()
的方法可以为主程序提供widget
。此时,主程序可以访问widget
的所有公共方法。如果需要,它还可以将其返回工厂,从而删除对该对象的任何公共访问。
如果可以的话,如何实现这一目标?
答案 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)
将小部件放在与工厂相同的包中,并将小部件的构造函数设置为具有受保护的可见性。这将限制对象的创建。
对于每个窗口小部件,可以部分实现访问控制。您可以在允许访问的对象的每个小部件中保留一个列表,只有工厂可以修改此列表(受保护的可见性)。对于所有公共函数,您需要用户传入已被授权访问窗口小部件功能的对象。您可以通过将授权的对象传递回工厂来返回对象,以便它将删除授权。
您可以将主类中的私有对象作为授权对象传递 - 这将阻止其他类使用该窗口小部件。但是,这并不妨碍其他类要求授权。
这有点不稳定,因为您可能忘记释放授权并使用“不死对象”混乱窗口小部件(除了窗口小部件中的访问控制列表之外的任何地方都不使用)。