Java中的对象池模式

2024-06-21

所以我实现了自己的对象池模式,它工作得很好并且符合预期。从列表中返回我的“老师”对象,并在没有对象时创建它们。

我的问题:返回的对象“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();
    }

目前池中唯一的对象是“教师”,所以我只需要检查池中是否有任何对象。注意:我没有跟踪正在使用的对象,只是跟踪我池中的对象,这是要求的一部分,但我很欣赏您的建议。


根据您想要返回的内容,考虑拥有多个对象池。如果你有以下的包结构(请原谅我的命名)怎么办:

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 )

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中的对象池模式 的相关文章

随机推荐