我正在寻找以下代码的帮助。我必须制作一个sphere类和另一个类来测试它,这是一个问题。我几乎已经了解了一切,但唯一让我丧命的是设定新的直径并获得新的体积。设置新直径时,直径很容易改变,但是当我尝试再次运行体积时,它仅使用旧直径而不是新直径。请帮忙谢谢!
public class Sphere {
private double sphDiam, volume, surfArea;
private final double VOL_RELAY = 4.0 / 3.0;
private final int SURF_CONST = 4;
public Sphere(double sphDiam) {
this.sphDiam = sphDiam;
setVolume();
setSurfaceArea();
}
public double getDiam() {
return sphDiam;
}
public void setDiam(double sphDiam) {
this.sphDiam = sphDiam;
}
public double getVolume() {
return volume;
}
public void setVolume() {
volume = Math.pow(sphDiam / 2, 3) * Math.PI * VOL_RELAY;
}
public double getSurfaceArea() {
return surfArea;
}
public void setSurfaceArea() {
surfArea = Math.pow(sphDiam / 2, 2) * Math.PI * SURF_CONST;
}
public String toString() {
return "Sphere diameter: " + sphDiam + "\nSphere Volume: " + volume + "\nSphere Surface Area: " + surfArea;
}
}
public class MultiSphere {
public static void main(String[] args) {
Sphere sph1 = new Sphere(10.5);
Sphere sph2 = new Sphere(8.4);
Sphere sph3 = new Sphere(20.1);
sph1.setDiam(3.2);
System.out.println(sph1.getDiam());
System.out.println(sph1.getVolume());
System.out.println(sph1.getSurfaceArea());
System.out.println(sph1);
System.out.println();
sph1.setDiam(2.5);
System.out.println(sph1.getDiam());
System.out.println(sph1.getVolume());
System.out.println(sph1.getSurfaceArea());
System.out.println(sph1);
System.out.println();
System.out.println(sph2.getDiam());
System.out.println(sph2.getVolume());
System.out.println(sph2.getSurfaceArea());
System.out.println(sph2);
System.out.println();
System.out.println(sph3.getDiam());
System.out.println(sph3.getVolume());
System.out.println(sph3.getSurfaceArea());
System.out.println(sph3);
System.out.println();
}
}
最佳答案
当您“设置直径”时,您正在更改形状的尺寸。但是您从未更新过音量。因此,volume
值仍反映以前的尺寸。
我想您的二传手应该只更新那个值。像这样:
public void setDiam(double sphDiam) {
this.sphDiam = sphDiam;
setVolume();
}
但是,如果您更进一步,可以稍微简化一下对象。查看您的
setVolume()
方法...它不接受值。实际上并没有设置任何内容,只是重新计算了动态值。该值根本不需要存储,只需在getter中计算即可。因此,完全摆脱
volume
变量,完全摆脱setVolume()
方法,然后将计算结果放在getter中:public double getVolume() {
return Math.pow(sphDiam / 2, 3) * Math.PI * VOL_RELAY;
}
重复其他任何计算值。
无需存储容易计算的值,因为这样您就承担了保持值同步的责任。这是导致您遇到此问题的原因。球所需的唯一值是半径(或直径)。所有其他值都从此得出。如果要存储其他值,则实际上是在多个位置存储相同的信息。最好尽可能避免这种情况。