2011-07-31 194 views
3

當非私有方法的參數屬於私有類型(例如,私有嵌套類)時,g ++和javac都不會發出警告。這些方法不能被客戶使用,但它們可以作爲類的公共API的一部分出現。例如,在C++中,將這些方法放入類Foo的公共部分中,可以允許其他類訪問這些方法,而不必在Foo類中顯式列爲朋友(只要它們可以訪問使用的私有類型作爲參數)。公共方法中的私有參數

但是一般來說,如果不明確地將這些方法隱藏起來,還是可以忽略這種方式,這會是一種糟糕的風格嗎? (因爲客戶無論如何不能使用它,最重要的是什麼)

+0

這是一個真正的錯誤,或者你爲什麼要這麼做? –

回答

4

這是允許的,也許是必需的。

雖然您可能不被允許創建私有類型的變量;它可能會被函數返回。這將允許數據在系統周圍傳輸,而不會在系統中沒有理由引用它的部分持久化。

這個習語不常見,但是被允許。

+0

確實需要將私有類型作爲通用對象實例返回,然後通過系統傳遞這些實例。但是,至少在Java中,需要這種類型作爲參數的方法實際上不能被外部代碼調用(除了可能通過Reflection)。相反,該方法需要接受其參數作爲對象,然後內部轉換爲實際類型。 – aroth

+0

我剛試過:「w.foo(w.qux());」 qux()返回w的私有內部類。這是從另一個班級調用的。它的工作,有些令我驚訝。使用Java 6. –

+0

啊,我看到你在那裏做了什麼。聰明。但是如果你喜歡'Object qux = w.qux();'後面跟着'w.foo(qux);',那麼它將不起作用。所以實質上你不能堅持'w.qux()'的結果來重用,你必須在你想使用它的時候調用它。 – aroth

3

風格我必須想象,將這些方法作爲公共API的一部分將被認爲是不好的風格。在使用庫時,您是否真的想看到在IDE的自動完成對話框中彈出的方法實際上不會彈出?我不這麼認爲。至於爲什麼沒有編譯器警告,在大多數(可能是所有?)面向對象的語言中(當然在Java中),用戶定義的對象類型只是簡單地傳遞給使用指針的方法。因此,不需要關於實際類型的知識就可以將一個引用作爲函數參數傳遞給它,只需要瞭解有關指針的知識即可。就編譯器而言,每個人都有關於如何創建指針的知識,因此它沒有任何基礎說「你實際上無法從外部調用它」。至少你可以用null的值來調用它。

+0

缺少警告,至少對於C++來說,是因爲編譯器沒有辦法確定某個類型是否完全是私有的;爲了警告,它必須依賴一個非常聰明的鏈接器(這使得很多假設)。 –

+0

+1即使這些成語具有有效用途,除非專門用於此類 – ManRow

相關問題