2013-03-15 77 views
0

我的Java類有一些問題。當我調用函數(例如int getCapacity(Edge e))時,它會更改我的對象(chagne Edge e),我不想那樣做。不應該只有void函數改變對象嗎?任何幫助?從not void函數修改對象

public class Edge{ 

    private int start; 

    private int end; 

    private int capacity; 

    private int flow; 

    public Edge(int p, int k, int cap) { 
     this.start = p; 
     this.end = k; 
     this.capacity = cap; 
     this.flow=0; 
    } 

    public void setStart(int s){ 
      this.start = s; 
    } 


    public static int getCapacity(Edge e){ 
      e.setStart(-1); 
      return e.capacity; 
    } 


    public static void main(String[] args){ 
     Edge e= new Edge(); 
     int k=getCapacity(e)); 
     e.print(); 
    } 
} 

謝謝!

回答

3

void函數不僅應該改變對象嗎?

不一定。這方面的一個非常簡單的例子是StringBuilder,這裏幾乎所有的方法都返回this,所以你可以寫:

builder.append(x).append(y); 

然而,奇怪做出一個getter修改狀態。這聽起來對我來說是個壞主意。目前尚不清楚爲什麼你在這種情況下改變了開始,但你肯定可以改變你的方法,不要這樣做。

即使這樣的規則可以偶爾雖然是錯誤的。一個簡單的例子就是一個LRU緩存,其中從中獲取數據確實會影響狀態,因爲它會改變緩存溢出時保留哪些記錄。雖然這比較少見。

也不清楚爲什麼getCapacity是一種靜態方法。注意具有與聲明類相同類型的參數的靜態方法。除非故意像處理空引用(這不是),否則通常應該將它們更改爲實例方法。

+0

我只是不想改變我的對象不是void函數。我插入了一部分代碼「e.setStart(-1);」只是爲了測試它。 關於吸氣劑,我稍後需要它。 ;)在其他類中。 – newOne 2013-03-15 14:16:26

+1

另一個例子是一個迭代器。它會改變它的狀態,每次調用並返回一個值。 – 2013-03-15 14:18:09

+0

@newOne:好的,不要這樣做 - 但它不是*不正確的代碼。 – 2013-03-15 14:26:07