2011-01-14 24 views
0
public class MyData { 
    public String id_number,first_name,last_name,age,level; 
    public MyData(String raw_string){ 
     String[] parameters = raw_string.split(","); 
     for(int x = 1;x<parameters.length;x++){ 
      String[] key_val = parameters[x].split("="); 
      if(key_val[0].equalsIgnoreCase("ID")){ 
       id_number = key_val[1]; 
      } 
      if(key_val[0].equalsIgnoreCase("FN")){ 
       first_name = key_val[1]; 
      } 
      if(key_val[0].equalsIgnoreCase("LN")){ 
       last_name = key_val[1]; 
      } 
      if(key_val[0].equalsIgnoreCase("AG")){ 
       age = key_val[1]; 
      } 
      if(key_val[0].equalsIgnoreCase("LV")){ 
       level = key_val[1]; 
      } 
     } 
    } 
} 

我通常申報類,如上面的一個在我學校的項目,到現在我一直在編程的現實世界的應用, 我使用get實踐 - 在理解的方法,它只能用於該類本身提供的控制。如果我直接聲明和訪問一個類的屬性,它會有什麼不同?

從我瞭解它的方式,聲明類的屬性,如一個以上可能導致價值意想不到的變化僅僅通過MyData.name = "Here's a new name for me.";

懶惰,我傾向於返回到實踐,因爲打字getName();setName("This is my name");太費時(我知道IDE可以加快速度,但仍然...)

更不用說爲每個屬性編寫兩個函數(get和set,加上clear(),如果需要的話)所花費的時間。 所以問題是,我是否真的需要遵循get-set方法? PS:請重新說明我的問題,以反映正確的編程術語(我沒有真正關注課程)。

回答

6

這個問題的答案圍繞着良好的編程風格,取決於有多少人閱讀這個問題,你會得到很多非常憤怒的回答,堅持要求這個問題是一種罪過。簡短的回答是:code encapsulation.

你正在爲你的課寫很小的程序,而且你正在把它們寫入一套在開始任務時已經熟知和準確定義的標準,並且永遠不會改變。不幸的是,在現實世界中編寫的程序很少有這些屬性。它們是一個大型的程序,其設計在程序完成之前並沒有真正完成(暗示,從來沒有),並且它們解決了那些不太瞭解和不斷變化的問題。

鑑於這些挑戰以及更多我沒有提到的問題(其中最大的結果是,一旦編寫代碼,您將多次更改代碼的很多部分),程序員已經想出了一套使編程更容易的做法。您可以做的最重要的事情是隔離程序中的更改。這意味着當您在系統的某個部分中更改某些內容時,應該儘可能少地改變系統的其他部分。

封裝是幫助您實現這種變更隔離的一種方法。如果你決定改變一些關於MyData類的東西,你必須改變每一個使用MyData的類。例如,假設您決定MyData應該比您定義的5個字段更多,或者MyData存儲區域應該在運行時動態更改。我會通過給MyData一個私有HashMap來實現這一點,該私有HashMap包含所有的字符串,然後可以通過鍵來訪問它。

在這種情況下,如果您使用過getFirstName(),getLastName()等,那麼使用MyData的其他類將不知道有任何更改,並且會繼續其業務。但是,通過公開數據,你所做的每一件事都必須進行修改,將幾分鐘的工作轉變爲一天或更長的時間。 (並且相信我,像這樣的小型實用程序通常會在很多地方使用。)

另外,儘量不要卡在我給你的例子上。至少還有其他5個例子可以想到,所以說這個例子永遠不會發生在你身上,或者找到一種不同的方式來解決它,不僅沒有想到這一點,它完全忽略了這一點。

2

那麼,這取決於你的意思是「需要」。如果你想結束任何程度的封裝,你不應該公開領域。如果您希望能夠更改數據存儲方式的實現細節,或驗證字段中設置的任何值等,則需要使用屬性。

存儲的詳細信息是執行的詳細信息。他們不應該影響來電者。如果你想改變版本之間的私有變量名稱,那絕對沒問題。如果你想從存儲(比如說)視圖的開始點和結束點到一個集合來存儲開始和計數,這很好 - 你可以在不破壞公共API的情況下做到這一切。

當然還有更多的封裝比只是使用屬性而不是公共字段,但它是一個基本的起點IMO。

我會強烈催促你使用屬性。

+0

屬性在Java中? – Nivas 2011-01-14 12:06:26

0

我完全同意其他答案。但豐富的啓用重構功能的IDE如Eclipse和IntelliJ將允許您輕鬆地將字段訪問的屬性更改爲getter/setter訪問權限(以及更多)。

如果你正在編寫一個將被其他開發者使用的程序(比如使用類似CVS的版本控制),那麼最好堅持編寫很好的封裝的getter/setter風格類來避免不必要的重構(導致提前進行愚蠢的合併衝突)。

如果您要在發佈您的更改之前自行開發一段時間,並希望快速完成工作,請使用可提高工作效率的樣式。在實際上將其提供給其他人之前,您可能會重構您的程序一百萬次,所以不妨在最終版本中使用它以節省您的時間。但這是編程風格的問題。

相關問題