2012-04-19 177 views
-5

在課堂上,我們通常會聲明全局變量和局部變量。我大部分時間看到聲明全局變量,setter,getters。這些都是必不可少的嗎?如果我可以在不使用這些東西的情況下實施它,那麼可以嗎?哪一個更好,在類中聲明全局變量或在Java類中聲明局部變量?

+1

他們做不同的事情。哪個更好?一輛汽車還是一列火車? – SLaks 2012-04-19 13:52:33

+1

@SLaks,顯然一隻熊是優越的! – Jakub 2012-04-19 13:54:39

+0

只需使用正確的工具即可完成工作。 – BalusC 2012-04-19 13:58:49

回答

3

一般來說,你應該儘量減少變量,方法,類等等知名度的範圍

所以,如果你需要一些變量,在一個調用序列用於使用局部變量和方法參數從方法到方法傳遞其價值。 比如我有2種方法foo()bar()foo電話bar

public void foo() { 
    bar(); 
} 
private void bar() { 
} 

比方說,在相同的字符串追加到它的一些後綴都工作。您可以使用局部變量如下面的例子:

public String foo(String s) { 
    s += "foo1" 
    bar(s); 
    s += "foo2" 
    return s; 
} 
private String bar(String s) { 
    s += "bar1" 
    return s; 
} 

或者類級變量:

private String s; 

public String foo() { 
    s += "foo1" 
    bar(); 
    s += "foo2" 
    return s; 
} 
private String bar() { 
    s += "bar1" 
    return s; 
} 

第一種方式是更好,因爲:

  1. 它被封裝。沒有人知道實施的細節。沒有人可以從外面影響它。
  2. 它更易於閱讀:您不必前後移動代碼即可瞭解參與實現的對象。
  3. 它是線程安全的,沒有任何額外的工作,如同步塊或原子變量,因爲它從不使用對象級變量。

第二個實現不是封裝的:可以添加更改對象狀態並影響下一次調用foo()的代碼。你必須在課堂上前進和後退,以瞭解算法和受算法影響的變量。它不是線程安全的。運行相同代碼的兩個併發線程可能會改變相同的變量。

1

通過全局變量你是指類成員字段?如果變量只在方法的範圍內使用,那麼它應該是本地的。如果變量基本上爲整個類實例承載任何狀態信息 - 它應該聲明爲類成員字段(使用setter和getters - 如果需要將這些字段授予其他類)。

在Java類很好的總結在這裏:http://docs.oracle.com/javase/tutorial/java/javaOO/summaryclasses.html

+0

-1。如果不需要,不要提供吸氣劑。更重要的是:如果不需要,不要提供setter,只有在修改屬性時才提供setter。 – 2012-04-19 13:58:59

+0

@JBNizet通過一切手段減去我,因爲setter和getters是我的答案的主要觀點(他們不是!) – maksimov 2012-04-19 14:03:20

+0

如果您在括號之間刪除了答案的最後部分,我會取消您。這導致認爲每個領域都必須有一個getter和一個setter,這是許多新手所犯的一個大錯誤。 – 2012-04-19 14:05:42

1

我猜你是界定「全局變量」作爲一個成員字段變量(一個方法的上下文之外定義)。使用成員字段時最好使用增變器(setter)和訪問器(getters),以便更容易地更改實現。一個很好的例子是,如果您在獲取或設置變量狀態時檢查字段周圍的條件,則可以將更改封裝在一個位置,而不是每次使用時都傳播。

0

Java中沒有全局變量。

一個字段應該只存在,如果它是對象的屬性。例如,它不應該用於在對象的兩個方法調用之間存儲中間結果。

只有當外界需要訪問信息時才能定義吸氣劑。如果不需要,則不要定義吸氣劑。越私人的狀態越好,因爲它可以讓班級在不影響其他班級的情況下進行平衡。

只有在需要修改字段的情況下才能對修改器進行修改,並且將該字段與其他修改器隔離開來是有意義的。

好規則:

  • 以下狀態不止狀態比可變的狀態更好
  • 不可改變的狀態較好
  • 的方法應該總是把對象從穩定一致的狀態到另一個穩定一致的狀態。