2017-04-10 156 views
1

我在寻找下面发布的代码的帮助。这是一个问题,我必须制作一个球体课程和另一个课程来测试它。我几乎了解了一切,但唯一让我难过的是设置一个新的直径并获得新的音量。当我设置一个新的直径时,直径容易改变,但是当我尝试再次运行音量时,它只使用旧的直径而不是新的直径。请帮助谢谢你!Java初学者: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(); 
} 
} 
+1

您正在调用'setVolume()'来计算音量并设置它。但是除了构造函数之外,你永远不会调用这个方法。设置新直径后,必须再次调用该方法。另外我会建议只是摆脱'setVolume()'和'setSurfaceArea()'方法,并在你的getter方法中进行计算。 –

回答

4

当您“设置直径”时,您正在更改形状的尺寸。但是你从未更新过音量。所以volume值仍然反映了以前的尺寸。

我想你的二传手应该更新这个值。事情是这样的:

public void setDiam(double sphDiam) { 
    this.sphDiam = sphDiam; 
    setVolume(); 
} 

但是...如果拿这一步,您可以简化对象位。看看你的setVolume()方法...它不接受一个值。它实际上并不是设置什么,它只是重新计算动态值。该值根本不需要存储,只能在getter中计算。

因此摆脱volume变量完全,摆脱完全由setVolume()方法,而只是把计算的吸气剂:

public double getVolume() { 
    return Math.pow(sphDiam/2, 3) * Math.PI * VOL_RELAY; 
} 

重复任何其它计算值。

有没有必要存储一个容易计算的值,因为那么你承担保持值同步的责任。这是什么导致你这个问题。球体唯一需要的值是半径(或直径)。所有其他值都源自此。如果你存储的是其他值,那么基本上你就是在多个地方存储相同的信息。尽可能避免这种情况。

+0

这是一个很大的帮助!现在一切似乎都处于正常工作状态。我使用体积和表面积的变量的唯一原因是,我可以做一个很好的toString返回,它给出了给定球体的当前直径/体积/表面积的反馈。任何想法,我应该把我的toString现在我没有变量使用? – Nick

+1

@Nick:你会使用该变量的任何地方,而不是使用getter。 – David

0

您只能在创建球体时设置音量和曲面。 如果您不告诉程序来执行此操作,那么设置新的直径不会自动重新分析音量和曲面。

有2个解决方案:

  • 重新计算面积和体积每次更改直径时间:

    public Sphere(double sphDiam) { 
        this.sphDiam = sphDiam; 
        setVolume(); 
        setSurfaceArea(); 
    } 
    
    public double getDiam() { 
        return sphDiam; 
    } 
    
    public void setDiam(double sphDiam) { 
        this.sphDiam = sphDiam; 
        setVolume(); 
        setSurfaceArea(); 
    } 
    
    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; 
    } 
    
  • 计算每次你得到它的时间价值,这样,你就可以删除变量volumesurface以及相关的设置程序:

    public Sphere(double sphDiam) { 
        this.sphDiam = sphDiam; 
    } 
    
    public double getDiam() { 
        return sphDiam; 
    } 
    
    public void setDiam(double sphDiam) { 
        this.sphDiam = sphDiam; 
        setVolume(); 
        setSurfaceArea(); 
    } 
    
    public double getVolume() { 
        return Math.pow(sphDiam/2, 3) * Math.PI * VOL_RELAY; 
    } 
    
    public double getSurfaceArea() { 
        return Math.pow(sphDiam/2, 2) * Math.PI * SURF_CONST; 
    }