Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于Java中另一个对象的状态创建对象_Java - Fatal编程技术网

基于Java中另一个对象的状态创建对象

基于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() 或者,使用静态方法创建实例并将碰撞对象作为参数传入爆炸是否更

假设您有一个名为Explosion的类,如果没有来自另一个类实例的一些信息,那么创建它的实例是没有意义的。构造函数未公开

这样做是否更好:

// 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);

我更喜欢第二种方法,因为它可以更好地在不同的类之间划分责任。要回答您的问题,请自问谁有责任制造爆炸,并采取相应行动。第二种方法基本上使用工厂方法来隐藏构造函数,但是责任仍然在爆炸类中,这在我看来是好的


为什么构造函数不是公共的?你能让它包可见,然后把冲突作为构造函数参数传递吗?

这取决于。。。主要依靠依赖性

如果您考虑 Bug < /COD>始终是一个较低的级别或一个<<代码>冲突/代码>的同位体,那么就去实现一个(虚拟)实例方法的灵活性和易用性。这将保持对象中的行为,并减少对getter的需求(这往往是设计不佳的标志)。当然,您仍然需要调用

爆炸
构造函数,只是现在它在
碰撞


另一方面,如果
冲突
不应依赖于
爆炸
,则直接寻找构造函数。这并不是虚拟方法的终结。如果事情变得更复杂,您可能会更改调用代码,以调用其他对象上的虚拟方法,该对象通过传入的
冲突创建
爆炸
的特定配置。这实际上取决于系统的范围。
如果你真的想“完全伸展”,这应该由第三个类来处理,代表系统中交互的“物理”

原因如下: 首先,碰撞会产生很多后果:爆炸、伤害、得分(这是游戏吗)?声音等等。你不想让所有的声音都过载而导致碰撞

另一方面,爆炸可能由于许多不同的原因(例如武器)而发生,爆炸是否应该明确知道可能导致爆炸的一切

如果你要对“世界”的许多方面进行建模,你可能需要第三个系统来负责这些因果关系。它从一个对象的状态中获取它所需要的,并创建另一个具有必要状态的对象,而不需要它们相互了解

  • 建议使用静态工厂方法,即第二个选项
  • 根据爆炸中所需的
    Collision
    中的参数,最好只传递这些参数,这样就不会违反

第二种方法的优点是,您不需要每次都创建爆炸对象(参考)。 如果您想拥有某种缓存机制(例如,您想基于类冲突的某些属性返回相同的爆炸实例),那么第二种方法很有用


另一方面,如果爆炸类只为实例创建提供静态工厂方法,那么它就不能被子类化

当我为简单的单元测试而设计时,我最终得到了我最喜欢的解决方案。静态方法和“新”操作符指出特定的类,使模拟实现变得困难。