2010-04-22 90 views
2

對不起,我之前沒有正確說明這個問題。我嘗試實施工廠模式。一個更好的例子:它是一個具有函數create的抽象類Human。基於傳遞來創建的參數,決定是返回其子類Man的實例還是返回子類Woman的實例。因此,您可以使用以下名稱創建:創建: Human john = Human.create("Man"); 子類男人和女人從抽象類Human繼承,並且在與Human相同的文件中定義。我不希望它可以通過以下方式擴展它:Human lisa = new Human("woman") {};來自主程序。謝謝!如何限制創建匿名子類(Java)

編輯:

感謝您的幫助!我最終使用的解決方案是讓人類公開,並創建其功能。 Human構造函數和Man和Woman類聲明爲「包保護」。

+1

你希望它是可能創造p的外面一個名爲子類的構造做到這一點? – justkt 2010-04-22 16:15:57

+0

不,我不能這樣做,現在你可以看到我已經編輯了我的問題,我只是想通過使用create在包中創建子類的元素。 – 2010-04-22 17:18:06

回答

1

不要在A的類聲明中使用可見性說明符,它將成爲包訪問類。

編輯以反映問題的變化:

選項1: 爲人類封裝構造私有。通過這樣做,任何試圖在包外部擴展Human的類都將失敗,因爲它不能調用超類的構造函數。

選項2: 堅持我最初的包私有類的建議,並使用一個公共訪問工廠類。

+0

對不起,這個問題是由我正確說明。我嘗試實施工廠模式。一個更好的例子:它是一個具有函數create的抽象類Human。基於傳遞來創建的參數,決定是返回其子類Man的實例還是返回子類Woman的實例。所以你叫創建: 人類約翰= Human.create(「人」); 男人和女人的子類是從抽象類Human繼承而來的,並且在與Human相同的文件中定義。我不希望它可以通過以下方式擴展它: 人類lisa =新人(「女人」){}; 來自主程序。 謝謝! – 2010-04-22 16:26:55

+0

對不起,它應該說「不正確說明」... :-) – 2010-04-22 16:27:39

+0

你應該編輯你的問題,以反映你在這裏說什麼,而不僅僅是回覆評論。 – DJClayworth 2010-04-22 17:03:34

0

這取決於你的意思是不可能的。如果你想要它被靜態地強制執行,唯一的方法就是使類包能夠被訪問,但是並不特別限制匿名類 - 它也限制了命名類。如果你想在運行時執行它,你可以在抽象類

if (this.getClass().isAnonymousClass() && !this.getClass().getName().startsWith(packageName)) { 
    throw new IllegalStateException("This class cannot be used as an anonymous inner class"); 
    } 
+0

我的問題很糟糕,真的很遺憾,因此浪費你的時間。但是如果你閱讀評論,我回答了第一個答案,我希望我能夠更好地描述我的問題。儘管如此,這是一個非常酷的方式。 乾杯! – 2010-04-22 16:37:14

+0

這個解決方案很好,謝謝。我只需要使用「if(this.getClass()。isAnonymousClass())」部分來實現我正在尋找的東西。 – 2010-04-22 16:43:42

+0

雖然在編譯時出現錯誤當然會很好。 – 2010-04-22 16:47:49