假设我有一个 Projectile
类,它充当我游戏中所有射弹的基类。这包含最大速度、重力系数、弹跳系数等的默认值。
public abstract class Projectile {
protected float maxSpeed = 100.0f;
protected float gravityCoefficient = 1.0f;
protected float bounceCoefficient = 1.0f;
...
}
然后我有一堆子类,每个子类都可以选择覆盖其中一些默认值。
哪种方法更好?
<强>1。在子构造函数中设置字段值
public class Arrow {
public Arrow(){
super();
maxSpeed = 200.0f;
}
}
<强>2。让 child 覆盖 getter
public class Arrow {
public float getMaxSpeed(){
return 200.0f;
}
}
我倾向于说第一种方法更好,因为这意味着可以直接访问字段而不需要任何额外的函数调用。但是,这确实意味着该值在对象创建期间设置了两次,一次由父项设置,一次由子项设置。
我在这里遗漏了什么吗?或许还有另一种方法?
最佳答案
直觉上,任何特定抛射物的最大速度在其生命周期内不太可能发生变化(即使在同一类型的不同实例可以具有不同的最大速度的情况下),因此我更倾向于它的最终领域。我也赞成将其设为 final - 除了真正的常量之外,我很少使用非私有(private)字段。
因为您有一些 Projectile
的状态(字段),我会避免让 getMaxSpeed
显示的最大速度与字段不同的混淆。
我可能会这样设计:
public abstract class Projectile {
private final float maxSpeed;
protected Projectile(float maxSpeed) {
this.maxSpeed = maxSpeed;
}
// Only if you really need this...
protected Projectile() {
this(200f);
}
public final getMaxSpeed() {
return maxSpeed;
}
}
public class Arrow extends Projectile {
public Arrow() {
super(100f);
}
}
重力系数和弹跳系数可以用类似的方式处理 - 或者如果所有这些确实充当“特定类型的每个实例的相同值”,您可以引入一个新类来表示这些常量,它将来自常量限制/系数的类型实例的不同状态 - 每个实例都可以最终引用该新类的实例。不幸的是,Java(以及至少一些类似的语言)并没有很好地模拟这种层次结构。总是很烦:(
关于java - 最好更改 parent 的领域或覆盖 setter/getter ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32307982/