2016-04-14 24 views
0

如果一個類包含一個對象作爲一個實例變量,而其中一個構造函數包含一個與參數類型相同的對象,最好的做法是將參數賦值給實例變量,或者從該變量創建一個新對象參數,並將THE NEW OBJECT賦值給實例變量。構造函數參數中的對象:創建新實例還是指定指針?

下面是一個鍛鍊我正在通過一個例子:

public class MyCircle { 

    private MyPoint center; //contains variables int x and int y 
    private int radius; 

    //Non-controversial Constructor: 
    public MyCircle(int x, int y, int radius) { 
    //creates new center using a valid MyPoint constructor 
    this.center = new MyPoint(x, y); 
    this.radius = radius; 
    } 

    //OPTION A 
    public MyCircle(MyPoint center, int radius) { 
    this.center = center; 
    this.radius = radius; 
    } 

    //OPTION B 
    public MyCircle(MyPoint center, int radius){ 
    this.center = new MyPoint(center.getX(), center.getY()); 
    this.radius = radius; 
    } 
} 

起初,我輸入選項A,但我認爲如果this.center引用可能被間接地修改現有的對象,這可能創造的錯誤行爲無意的。我猜想,另一種思考方式是創建一個創建共享中心的多個對象的途徑,而移動一箇中心將故意移動共享該中心的所有圈子。

+0

這裏沒有真正的最佳實踐,因爲您可能希望調用代碼能夠修改中心。或者你沒有。你也可以確保一個「MyPoint」是不可變的,所以「x」和「y」的值不能被改變,這也將消除複製「MyPoint」到構造函數。 – f1sh

回答

0

由於Java沒有指針(至少對於開發人員)該選項將被丟棄,是不是要走的路.. 現在這個:

public MyCircle(MyPoint center, int radius) { 
    this.center = center; 
    this.radius = radius; } 

在我看來是更好的,你可以分配中心,並且不需要製作MyPoint的冒險副本......而且我說冒險,因爲如果你想這樣做,你至少應該檢查該參數的非空值條件......

你可以肯定地認爲......如果選項A中的中心爲空,你是對的,那可能發生,那麼你可以通過拋出一個非法列表來處理它ameterexception,或只是將該對象分配給默認值。 ..

但正如我之前說的是我的看法..

+0

謝謝。我沒有意識到「指針」就是這樣一個特定的術語。這個問題實際上應該是「......創建一個新對象或爲現有對象分配一個引用」?我也很感謝MyPoint或其他類似對象可能爲空的警告。 –

0

我認爲這取決於你的程序。如果您希望該圓圈有對MyPoint對象的引用,那麼您必須通過它。否則,爲什麼不自己傳遞xy值。

例如,B選項可以寫成:

public MyCircle(int x, int y, int radius) { 
    // rest 
} 
0

兩個選項都很好,但你說,一個對象可以在時間而改變,當你要修改的選項A是OK同時在一個以上的對象中居中,例如在一個圓圈列表中,但是如果你想擁有獨特而獨立的中心點,則選項B是正確的。所以你爲什麼不具備兩個構造函數,並根據應用中的許多情況使用一個或另一個構造函數,使用任何你想要的更好的方法,保留兩者,這是我的建議。

希望它對你有幫助。

相關問題