2010-06-17 76 views
0

什麼時候在班級的各種方法中使用專用字段時應該認爲是危險的?我主要是創建變量並將其設置爲默認值,如null。然後在我的方法中引用它並將其設置爲方法中該對象類型的一個實例。何時不使用私人領域?

我不知道我的問題是否有意義,但讓我知道如果它不,我會澄清。

+0

請舉個例子。擁有經常在課堂上使用的私人領域並不奇怪。目前還不清楚你的意思,「我主要是創建變量並將其設置爲默認值,如null。」理想情況下,字段在構造函數中初始化爲有效值,所以類不變總是成立。 – 2010-06-17 21:04:26

+1

你問是否可以在一個函數內設置私有字段? – Brandi 2010-06-17 21:16:58

+0

我正在談論你在你的類的頂部聲明的私有字段,該類的作用域僅限於該類,並且該類只是一個類的典型私有字段,而且這些字段是從該類中的各種方法引用的。有些情況下,你不應該使用很多這樣的類作用域,因爲它可能導致衝突的變化,並且方法將引用具有不穩定值的字段,因爲其他方法可能會在它到達另一個之前將其更改。 – PositiveGuy 2010-07-20 01:17:20

回答

2

一般來說,如果你去各地使用字段在你的類就應該私人的,但經常可以是在許多地方被管理的代碼氣味信號的狀態。

本身並不差,但在這種情況下複雜性可能會迅速增長。

+0

是的我不是在談論全局...只有私人領域。 – PositiveGuy 2010-06-17 21:05:14

+0

@coffeeaddict,但它聽起來像你正在使用私有字段,其中本地變量也會同樣如此。這絕對是一種代碼味道......不好的一個。 – 2010-06-17 21:09:57

+0

這取決於,你將有一些在你的班級的頂部可以重複使用... ...並非所有的變量都是本地的,但最多的是。我發現我可以在我的類的頂部重用2-3個字段,例如表示由構造函數設置的單例,然後在需要它的方法中重用該字段,因爲該單例不會更改...它是單身。我班有幾種方法需要它......沒什麼大不了的。沒有理由通過它需要它的每種方法的參數。 – PositiveGuy 2010-07-20 01:23:41

4

如果你只需要一個方法內的成員,那麼就更喜歡使它成爲局部變量而不是成員。變量越局部,理解程序就越容易。

如果需要在多個調用中使用相同的對象,則可以考慮是否可以將該成員設置爲只讀並在構造函數中進行設置。

+0

如果你沒有在構造函數中設置它,那麼該怎麼辦...意味着你的類中的一個方法有設置它的邏輯,並且你想讓它保持設置的方法。 – PositiveGuy 2010-07-20 01:22:10

0

如果變量包含敏感數據,您應該意識到它仍然可以從外部通過反射訪問。

否則,如果你可以避免私人領域,你不應該使用一個。如果你不能,如果使用正確,本地域沒有任何問題。

這是一個壞主意:

public class Calculator() 
{ 
    private int result; 

    public int Add(int a, int b) 
    { 
     result = a + b; 
     return result; 
    } 
} 

,因爲你可以得到一個競爭條件,如果兩個線程調用Add()方法,在同一時間,第一個線程設置後的結果上下文切換到第二個線程設置結果,兩個調用都返回第二個值。

這些錯誤很難調試,因爲它們是完全隨機的。

+0

是的,但是如果我使用所有的本地語言,那麼當對象可以被重用時,我將不得不重新創建對象的實例。 – PositiveGuy 2010-07-20 01:26:10

+0

當然,但這只是一個競爭條件的簡單例子。正如我寫的:如果有意義,使用本地字段是可以的。重複使用對象是使用本地字段的一個很好的理由。 – 2010-07-20 14:55:12