24

我正在研究StringTokenizer.java班,並且出現了幾個想到的問題。關於公共方法的私人方法

我注意到其他類使用的公共方法調用了一些完成所有工作的私有方法。現在,我知道OOD的原則之一就是儘可能多地隱私並隱藏所有的實現細節。我不確定我完全理解這背後的邏輯。

我知道將字段設置爲私有是非常重要的,以防止將無效值存儲在其中(只是其中一個原因)。但是,談到私人方法時,我不確定他們爲什麼如此重要。

例如,在StringTokenizer類的情況下,我們不能只是將所有的實現代碼放在公共方法中嗎?由於這些方法的API(即調用這些公共方法的規則)將保持不變,它將如何改變使用這些方法的類?我能想出爲什麼私有方法有用的唯一原因是因爲它可以幫助您避免重複編寫代碼。例如,如果所有的公共方法都做了同樣的事情,那麼你可以聲明一個私有方法來完成這個任務,並且可以被公共方法使用。

其他問題,與公共方法相比,用私有方法編寫實現有什麼好處?

這裏是一個小例子:

public class Sum{ 

    private int sum(int a, int b){ 
     return a+b; 
    } 

    public int getSum(int a, int b){ 
     return sum(a,b); 
    } 
} 

Vs的...

public class Sum{ 

    public int getSum(int a, int b){ 
     return a+b; 
    } 
} 

是怎樣的第一個樣本更有益?

回答

28

爲了添加一些東西,一個私有方法總是可以安全地進行更改,因爲你確定知道只能從自己的類中調用,沒有外部類可以調用私有方法(它們甚至不能看到它)。

所以擁有一個私有方法總是很好,因爲您知道改變它並沒有問題,即使您可以安全地向該方法添加更多參數。

現在想到一個公共方法,任何人都可以調用該方法,所以如果添加/刪除參數,則還需要更改對該方法的所有調用。

+1

我不明白你的意思。如果我錯過了一些東西,請原諒我。我說:「所以擁有一個私有方法總是很好,因爲你知道改變它沒有問題,即使你可以安全地向該方法添加更多參數」。但是,面向客戶端的公共API仍然是一樣的。所以你寫了一個公共方法中的所有邏輯,或者在其中調用一個函數,或者做任何查看公共API的客戶端都沒有觀察到任何差異的東西。實現中的代碼仍然可以在任何時間點更改,這與改變私有函數的合同/實現一樣好 – Saurabh

+0

@saury在這種特殊情況下,是的,它是相同的API,但您仍然不能保證它未來會保持不變。根據我自己的經驗,我可以從「哦,讓我們直接公開這個想法」這個想法爲您提供建議,如果將來我們需要它私人化,我們會改變它「最終發生的事情是這樣的方法從來沒有成爲私有的,所以它最好是在開始時有一點過度體系結構,而不是稍後再做一個巨大的重構。 –

+0

如果一個公共方法調用了「沒有問題」更改的私有方法,那麼公共方法是否會中斷呢?如果是這樣,在「安全地改變」任何事物方面沒有任何區別。無論你改變什麼都必須進行測試 - 使其公開/私人不會給你任何額外的安全性。 – gented

2

我能想到爲什麼私有方法很有用的唯一原因是因爲它可以幫助您避免重複編寫代碼。

除了合併重複代碼(通常表述爲「不要重複自己」或「乾燥」)之外,使用私有方法還可以幫助您構造和記錄代碼。如果你發現自己的寫作方法有幾件事情,你可以考慮將它分成幾種私人方法。這樣做可能會使每個邏輯塊的輸入和輸出更清晰(更細粒度)。此外,描述性方法名稱可以幫助補充代碼文檔。

+1

是的,我同意你的意見。我試圖問的問題是,與公共方法相比,爲什麼在私有方法中編寫實現代碼有益?如果我們將所有的代碼放入公共方法中,這會產生什麼不同?基本上,我們仍然以同樣的方式調用公共方法,我們仍然期待它能像以前一樣返回相同的結果。 – kpatelio

+3

@ user600194保持代碼私有隱藏了實現細節,並允許在不中斷API使用者的情況下更改實現。隱藏/封裝的級別通常是任意的(偶爾反覆無常)。 –

0

制定職能私人給你在下列情況下的優勢:

  1. 製作功能私營給JVM編譯器內聯函數,從而提高了應用性能
  2. 的選項如果類是繼承和你擴展它來自一個子類,那麼如果你想隱藏子類的函數,那麼你可以這樣做(你可以擴展StringTokenizer)。
  3. 如果一段代碼在多種功能中使用的您移動代碼在私營公用事業方法
+0

你的#3不是私人的優勢*;共享代碼可以是公共的或私有的。 –

+0

好的,爲了解釋我的觀點,進一步說你有一套算法實現功能(全部公開)。現在萬一您的不同API需要計算兩個數字平方和的平方根,那麼最好將這個邏輯移入一個以兩個數字作爲輸入的私有函數中。公開這樣的功能可能沒有多大意義,因爲你的班級正在爲不同的算法問題聯盟提供解決方案。製作這樣一個公共的功能可能會破壞該類的定義。 – Saurabh

1

當用Java編寫乾淨的代碼或其它任何面向對象的語言,一般乾淨最可讀的代碼由簡短的簡短方法組成。經常會發現,方法中的邏輯可以在單獨的方法調用中更好地表達,以使代碼更清潔,更易於維護。

考慮到這一點,我們可以設想你有許多方法執行單個目標任務的情況。想想只有一個複雜目的的課程。單一目標的切入點可能只需要一個起點(一個公共方法),但其他許多方法是複雜操作(許多私人幫助方法)的一部分。

使用私有方法,我們可以隱藏不在和不應該從類之外的任何地方訪問的邏輯。

1

公共方法通常是其他實現該類的類將要使用的代碼。在班級以外,私人方法通常沒有那麼有用,或者不(僅僅)服務於課堂要完成的目的。

假設你在你選擇的IDE中,並且你實現了一個A類.A類只被設計用來做一件事,比如文檔生成。自然,您將在A類中有一些數學和字節操作方法來生成文檔,但試圖使用A類的人不會需要這些其他方法,因爲他們只是想要一個文檔。所以我們使這些方法保持私密,以便爲我們班的將來用戶保持簡單。

0

在公共類中使用私有方法的一個優點也是一個很好的理由,就是爲了安全和防止錯誤。聲明爲私有的方法只能由它們所屬的類訪問。這意味着您的私有方法不能在程序內部從別處被意外調用,從而減少錯誤和其他複雜性。如果你宣佈你的方法是公開的,它可以被整個問題訪問,並可能導致併發症。

您可能有許多方法可用於您不希望程序的任何其他部分能夠干擾的某些數據。通過私有方法和/或變量使用數據封裝有助於防止這種情況發生,並且使代碼更易於遵循和記錄。

1

聲明的方法私人的目的是

  • 隱藏實現細節
  • 排除方法被列爲公共API
  • 確保代碼背後的邏輯不使用/外部濫用
  • 大多數情況下,您的方法的執行依賴於在其之前運行的其他方法;那麼你也可以確保你控制了使用你的方法的正確順序

除非你打算讓你的方法在你的類的上下文之外安全地使用,否則對你的方法使用私有方法。