假设我有一个名为Factory
. 我打算让该类公开访问,以便任何人都可以创建和访问factory
. 我希望工厂创建和分发widgets
. 我只希望工厂能够创建widgets
,而不是公共程序空间中的任何人。但是,我想要一个调用的方法,它会向主程序distribute()
发出 a 。widget
那时主程序可以访问所有的公共方法widget
。如果需要,它还可以将其返回工厂,从而删除对该对象的任何公共访问。
如果这是可能的,如何做到这一点?
假设我有一个名为Factory
. 我打算让该类公开访问,以便任何人都可以创建和访问factory
. 我希望工厂创建和分发widgets
. 我只希望工厂能够创建widgets
,而不是公共程序空间中的任何人。但是,我想要一个调用的方法,它会向主程序distribute()
发出 a 。widget
那时主程序可以访问所有的公共方法widget
。如果需要,它还可以将其返回工厂,从而删除对该对象的任何公共访问。
如果这是可能的,如何做到这一点?
你正在寻找的是一个内部类。通过将内部类的构造函数声明为private,只有封装类才能访问!然后在外部类中创建一个工厂方法来构建小部件并分发它。我已经在static
这里声明了,但这不是必需的,具体取决于您的需要。
public class Factory {
public static Widget buildWidget() {
Widget widget = new Widget();
return widget;
}
public class Widget {
private Widget() { ... }
public void someMethod() { ... }
}
}
请注意,在干净的代码中,您必须通过注意引用完整性来解决您的其他问题。要“归还”小部件,必须释放对它的所有其他引用。您的工厂当然可以跟踪它发出的小部件,但是很难可靠地“召回”小部件。
您正在描述随时间变化的访问控制(“如果需要,它也可以将其返回工厂,从而删除对该对象的任何公共访问。”)。Java 不是那样工作的。所有访问限定符都经过静态检查,并在程序的整个生命周期内保持不变。
将小部件放在与工厂相同的包中,并将小部件的构造函数设置为具有受保护的可见性。这会将对象的创建限制在工厂中。
对于每个小部件,可以部分实现访问控制。您可以在允许访问的 Objects 的每个小部件中保留一个 List,并且只有工厂可以修改此列表(受保护的可见性)。对于所有公共功能,您需要用户传入一个已被授权访问小部件功能的对象。您可以通过将已授权的对象传递回工厂来返回该对象,以便工厂删除授权。
您可以将主类中的私有对象作为授权对象传递 - 这将阻止其他类使用小部件。但是,这并不妨碍其他类请求授权。
这有点不稳定,因为您可能忘记释放授权并使用“不死对象”使小部件混乱(除了小部件中的访问控制列表外,其他任何地方都没有使用)。