每次交换缓冲区时,重用对象实例与创建新实例之间有什么区别和缺陷?
背景:
这是我的游戏引擎项目.
我正在写一个TripleBuffer,我有三个版本的每个对象:旧版本,当前版本和未来版本.将通过从当前版本读取状态并将更改应用于将来的版本来对这些对象进行更改.在对所有对象进行更改后(如果适用),将交换缓冲区:将来的对象成为当前对象,当前对象成为旧对象,还是旧对象?
说明:
使用案例:
假设大约1000个对象以30Hz交换,这意味着它们需要每秒重建30次,方法是克隆现有的对象,或者重用现在过时的旧对象(覆盖其所有状态).
它们的复杂程度可以从大约5个属性到数百个属性,并且总是具有至少2个级别的深度.
(深度至少为2级 =缓冲对象本身只包含其他唯一对象的地图,这些对象组成了它们)
重新创建和重用都需要迭代当前对象及其组件(短于:反过来构成它们的对象).
进一步考虑:
在引擎的其他部分,将有事件触发和其他魔法,它们将使用对象的及时快照.因此,重新创建或重用的决定将导致:
回到一个较旧的项目并开始更新其依赖项之后,我必须意识到自从版本以来,logback不再将MDC传播给子项1.1.5:https://github.com/qos-ch/logback/commit/aa7d584ecdb1638bfc4c7223f4a5ff92d5ee6273
这种变化使得大多数日志几乎无用.
虽然我可以理解链接问题中给出的论点,但我无法理解为什么这种更改不能以更向后兼容的方式进行(如java中通常常见的那样).
问:除了必须将所有内容从Runnables子类化为Threads之外,实现相同行为的现在正确的方法是什么?
我有一个MyInterface具有众多实现和集合的接口Collection<MyInterface>.
现在怎么样,我可以保证的是有没有 2种元素在这集是同一类型的?
而如何我可以阻止任何进入从被覆盖?
意味着在任何给定的时间点只有集合中每个实现的1个实例.
出于显而易见的原因,我无法equals(Object obj)在界面中添加默认实现.我也不能以任何方式保证每个实现都会覆盖该equals(Object obj)方法(显而易见但是为了彻底性而在这里).
我目前看到的唯一方法是创建一个抽象类MyAbstractClass.但这似乎有点矫枉过正(?)