所以我已经实现了自己的对象池模式,它可以正常工作并且符合预期。从列表中返回我的“Teacher”对象,并在没有任何对象时创建它们。
我的问题:返回的对象“教师”然后需要被投入其子类之一,这些子类是专门的,例如“生物学教师”。
获得此类功能的最佳方法是什么?
编辑: 对不起,我认为不需要代码,但现在就去了。
以下是我正在谈论的演员。这会引发运行时异常,这是我的主要问题。
final Bio-Teacher = (Bio-Teacher) ObjectPool.getTeacher();
这是我的getTeacher()方法中的代码。
if (objectPool.size() > 0) {
System.out.println("Object returned from list");
return ObjectPool.remove(0);
} else {
System.out.println("Object made and returned");
return new Teacher();
}
目前,池中唯一的对象是“教师”,所以我只需要检查池中是否有任何对象。注意:我没有跟踪正在使用的对象,只是我池中的对象,它的部分要求,但我很欣赏这些建议。
答案 0 :(得分:4)
根据您想要取回的内容,考虑拥有多个对象池。如果你有包的结构(并原谅我的命名)怎么办:
com.foo.bar.AbstractTeacher
com.foo.bar.Teacher // A factory
com.foo.bar.BioTeacher
com.foo.bar.PhysicsTeacher
...
这些类中的每一个都维护自己的对象池。 BioTeacher只包含BioTeacher,而Teacher包含所有教师对象
因此,您将拥有如下代码:
Teacher t = Teacher.getTeacher();
BioTeacher b = BioTeacher.getTeacher();
这将简化来自更通用池的转换,因为您可以在获得之前指定所需的教师类型(尽管如此,它确实使Teacher类和BioTeacher类池之间的同步更加复杂)。
通过制作包级别方法来处理它(它们可以被同一个包中的其他类调用(注意所有类在com.foo.bar
中的所有类),并且不能被外部的对象调用)那个包裹。
填充池将使用
完成Teacher.createTeacher(BioTeacher.class)
然后在BioTeacher池中注册教师或者:
BioTeacher.createTeacher()
然后在教师池中注册教师。
如果在多线程环境中工作,那就是棘手的部分(因为这是一种学习经验,所以请注意方法Teacher.getTeacher()
和BioTeacher.getTeacher()
,其中一个人可能会遇到竞争条件,其中一个线程从getTeacher获取教师,而另一个线程从BioTeacher获得一个。
另一种方法(忘记上面的多个构造函数)是在Class,List<Teacher>
类本身内维护Teacher
的映射。当您要求教师(Teacher.getTeacher(Teacher.class)
或Teacher.getTeacher(BioTeacher.class)
)时,您需要在地图中查找并返回相应列表中的项目。此外,在这个方法(可以同步)中,您可以在另一个列表中找到教师(它将始终至少在两个列表中(Teacher.class和BioTeacher.class))并将其从该列表中删除。 / p>
然后你可以制作代码:
BioTeacher Teacher.getTeacher(BioTeacher.class)
无需额外铸件即可工作。同样,这是一种学习体验,可以让您更多地了解Java的泛型。 (有关此方法的更多信息,请How do I return an instance of an object of the same type as the class passed in using Java 6?)
答案 1 :(得分:2)
你是在做这个学习练习吗?
如果是这样,o.k.,但对象池,除了极少数例外,是一个坏主意和损害性能。请参阅实践中的Java并发部分11.4.7“只对对象池说”否“。或者查看Performance Myths Revisited。哎呀 - 原始链接失败,试试这个。
(添加)。至于你的问题,不要以为你能做到。想象一下,如果BiologyTeacher没有教师或历史教师的额外领域。它们的大小不同 - 如何重用内存?
答案 2 :(得分:2)
如果您的对象池实际上正在返回Bio-Teacher类型的实例,那么是
Teacher t = ObjectPool.getTeacher();
if (t instanceof Bio-Teacher) {
final Bio-Teacher bioTeacher = (Bio-Teacher) t;
// do something with the Bio-Teacher.
} else {
// do something with Teacher t (and Teacher t is not a Bio-Teacher).
}
你也可以尝试添加一个带有Teacher
的Bio-Teacher构造函数,然后你可以
Bio-Teacher t = new Bio-Teacher(ObjectPool.getTeacher());