我有一个系统,允许我为每个玩家创建和实现类型安全变量。每个变量都是沿着
@Foo
public static final Bar KILLS = new Bar();
注解将变量标记为在运行时拾取以进行注册。这些变量本质上是静态的mutator方法,可以像这样调整所讨论的播放器的基本值
KILLS.set(player, 10);
系统运行得很好,但是每种类型(object、int、string等)都有一个可变类型作为后盾,该类型被延迟地加载到各自玩家的变量Map中。我对这个设计可能带来的潜在垃圾问题很好奇,因为玩家数量会不断上升。我知道由于java的自动装箱机制,有些事情是不可避免的,但也许其他地方还有改进的空间。我并不完全熟悉java内存模型,所以请原谅我的解释或缺乏它。
编辑:
为了更清楚一点,每个变量类型都扩展了一个父类,并分别提供了一个t类型。然后,这些子类可以访问重写所需的方法,这些方法允许它们改变相关player变量的值。
1条答案
按热度按时间mzillmmw1#
首先,我想说的是,我对你提到的“垃圾问题”感到有点困惑,因为你的上下文并不完全清楚你指的是java对运行时内存的隐式垃圾收集,还是你担心这个注册数据堆积在其他地方,比如数据库。
如果您指的是java的运行时内存管理:java是(正如您可能知道的)自动垃圾收集的,但是您可以建议(没有任何保证)java随时使用
System.gc()
. 这几乎总是一个微优化,几乎没有真正的好处,因为java在确定正确的时间进行垃圾收集方面已经非常出色了。我甚至不用担心java的问题。如果你指的是存储这些数据的外部模型,我会很担心。通过使用抽象的“setter”方法,由于缺少更好的术语,您将暴露错误或副作用以破坏该内存。这是需要双重管理的东西,以便在java实现上尽可能地避免bug,但是您还需要自己管理外部存储器上的内存。
尽管如此,这样的情况几乎可以肯定地表明,支持代码需要重组和更多的指导。这个抽象的setter方法(在我看来)是一种代码味道。