基于Java中另一个对象的状态创建对象
假设您有一个名为Explosion的类,如果没有来自另一个类实例的一些信息,那么创建它的实例是没有意义的。构造函数未公开 这样做是否更好:基于Java中另一个对象的状态创建对象,java,Java,假设您有一个名为Explosion的类,如果没有来自另一个类实例的一些信息,那么创建它的实例是没有意义的。构造函数未公开 这样做是否更好: // both classes are in the same package Explosion e; Collision c = new Collision() // do some stuff with collision e = c.createExplosion() 或者,使用静态方法创建实例并将碰撞对象作为参数传入爆炸是否更
// both classes are in the same package
Explosion e;
Collision c = new Collision()
// do some stuff with collision
e = c.createExplosion()
或者,使用静态方法创建实例并将碰撞对象作为参数传入爆炸是否更好:
Explosion e
Collision c = new Collision()
// do some stuff with collision
e = Explosion.createExplosion(c)
当您是这两个类的作者时。我当然更喜欢第二个类,因为它是面向对象的。为什么构造函数不是公共的?对我来说,使用一个将冲突引用作为参数的构造函数似乎是明智的 这样你就可以:
Explosion e;
Collision c = new Collision();
// do some stuff with collision
e = new Explosion(c);
我更喜欢第二种方法,因为它可以更好地在不同的类之间划分责任。要回答您的问题,请自问谁有责任制造爆炸,并采取相应行动。第二种方法基本上使用工厂方法来隐藏构造函数,但是责任仍然在爆炸类中,这在我看来是好的
为什么构造函数不是公共的?你能让它包可见,然后把冲突作为构造函数参数传递吗?这取决于。。。主要依靠依赖性
如果您考虑
构造函数,只是现在它在爆炸
中碰撞
另一方面,如果
冲突
不应依赖于爆炸
,则直接寻找构造函数。这并不是虚拟方法的终结。如果事情变得更复杂,您可能会更改调用代码,以调用其他对象上的虚拟方法,该对象通过传入的冲突创建爆炸的特定配置。这实际上取决于系统的范围。
如果你真的想“完全伸展”,这应该由第三个类来处理,代表系统中交互的“物理”
原因如下:
首先,碰撞会产生很多后果:爆炸、伤害、得分(这是游戏吗)?声音等等。你不想让所有的声音都过载而导致碰撞
另一方面,爆炸可能由于许多不同的原因(例如武器)而发生,爆炸是否应该明确知道可能导致爆炸的一切
如果你要对“世界”的许多方面进行建模,你可能需要第三个系统来负责这些因果关系。它从一个对象的状态中获取它所需要的,并创建另一个具有必要状态的对象,而不需要它们相互了解
- 建议使用静态工厂方法,即第二个选项
- 根据爆炸中所需的
Collision
中的参数,最好只传递这些参数,这样就不会违反
第二种方法的优点是,您不需要每次都创建爆炸对象(参考)。
如果您想拥有某种缓存机制(例如,您想基于类冲突的某些属性返回相同的爆炸实例),那么第二种方法很有用
另一方面,如果爆炸类只为实例创建提供静态工厂方法,那么它就不能被子类化 当我为简单的单元测试而设计时,我最终得到了我最喜欢的解决方案。静态方法和“新”操作符指出特定的类,使模拟实现变得困难。