1. 程式人生 > >我們需要getter和setter方法麼?

我們需要getter和setter方法麼?

在日常工作中,Java是我最頻繁使用的語言。關於getter和setter我也聽說過不少。我的感覺是在許多場合,我們不需要getter和setter方法。

回想一下我們寫JavaBean,建立一個類,然後編寫一些private欄位,最後使用一個smart IDE幫助我們生成對應的getter和setter方法(或者使用某個第三方類庫的annotation)。但是讓我們仔細的想一下,我們是怎樣使用這些欄位的,換句話說,我們為什麼一上來就把欄位寫成了private?

我把欄位的訪問分為四種:

  1. 只讀不寫
    這個很好理解,就像immutable型別。在這個時候,我覺得欄位可以定義為public final型別,然後只在構造中對其賦值就可以。
  2. 只寫不讀
    這個時候該欄位可能被用來計算其它的東西,這個時候如果該欄位不能對外暴露,則應該將欄位定義為private,然後僅提供一個public的getter方法。
  3. 又寫又讀
    這個完全可以使用一個public欄位,直接使用即可。
  4. 不讀不寫
    這是一種不存在的情況。

從上面的描述可以看出,除了第二種情況外,其它對欄位的讀寫操作完全不需要getter和setter方法的存在。

其實這個問題很好理解,當我們將欄位定義為private時,本身是想要把這些欄位封裝起來,不希望外界對這些欄位直接進行讀和寫。但是,完全不被外界所用的欄位是沒有必要存在的,因此,這些被封裝的欄位總會通過某種方式由外界輸入或者輸出給外界,這裡所說的“某種方式”指的是在對這些欄位讀取或賦值之前,進行某些計算。如果單純的將private欄位通過getter和setter方法暴露給外界,和直接把欄位定義為public沒有任何的區別。

因此,我個人認為,純粹的getter和setter方法是完全沒有必要存在的。這些方法不但非常麻煩,而且還會影響開發的效率。想想如果某個JavaBean有很多的欄位該怎麼辦?也許IDE可以幫助我們,那麼測試覆蓋率呢?我們應該關注它們的測試覆蓋率麼?

所以getter和setter,還是省省吧!