根据您想要返回的内容,考虑拥有多个对象池。如果你有以下的包结构(请原谅我的命名)怎么办:
com.foo.bar.AbstractTeacher
com.foo.bar.Teacher // A factory
com.foo.bar.BioTeacher
com.foo.bar.PhysicsTeacher
...
每个类都维护自己的对象池。 BioTeacher 仅包含 BioTeacher,而 Teacher 包含所有 Teacher 对象
因此,您将拥有如下代码:
Teacher t = Teacher.getTeacher();
BioTeacher b = BioTeacher.getTeacher();
这将简化从更通用的池中进行的转换,因为您可以在获得教师之前指定您想要的教师类型(尽管是的,它确实使 Teacher 类和 BioTeacher 类池之间的同步变得更加复杂)。
通过创建包级方法来解决这个问题(它们可以由同一包中的其他类调用(注意所有类是如何在com.foo.bar
),并且无法被该包之外的对象调用。
填充池可以用以下任一方法完成
Teacher.createTeacher(BioTeacher.class)
然后将教师注册到 BioTeacher 池中,或者:
BioTeacher.createTeacher()
然后将教师注册到教师池中。
如果在多线程环境中工作,棘手的部分(需要记住的是,因为这是一个学习经验)在方法中Teacher.getTeacher()
and BioTeacher.getTeacher()
其中可能会出现竞争条件,其中一个线程从 getTeacher 获取 Teacher,而另一个线程从 BioTeacher 获取 Teacher。
另一种方法(忘记上面的多个构造函数的内容)是维护一个映射Class,List<Teacher>
内Teacher
类本身。当你向老师求教时(Teacher.getTeacher(Teacher.class)
or Teacher.getTeacher(BioTeacher.class)
)您在地图中查找并从适当的列表中返回一个项目。此外,在这个方法(可以同步)中,您可以在另一个列表中找到老师(它总是在至少两个列表中(Teacher.class 和 BioTeacher.class))并将其从该列表中删除。
然后你可以编写代码:
BioTeacher Teacher.getTeacher(BioTeacher.class)
无需额外铸件即可工作。再次强调,这是一次学习经历,将使您更多地了解 Java 的泛型。 (有关此方法的更多信息,请访问如何返回与使用 Java 6 传入的类相同类型的对象实例? https://stackoverflow.com/questions/9790908/java-6-how-return-instance-of-object-of-same-type-as-class-passed-in )