2017-04-10 154 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; 
    }