2015-04-04 115 views
2

我正在使用域,視圖和控制器。每個包含他們自己的類。防止其他類的類實例化

該域包含許多不應該在域外的類中實例化的類。我的印象是默認訪問修飾符會幫助我。使我的領域類的構造函數包可見。

在導入正確的package.class文件後,任何類仍然可以使用構造函數。

我該如何防止這種情況發生?

+1

您的課程是否宣佈爲公開? https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html _「一個類可以使用修飾符public聲明,在這種情況下,該類對所有類都是可見的。類沒有修飾符(默認,也稱爲包私有),它只在它自己的包中可見「_ – Vahx 2015-04-04 17:35:10

+1

這也許是有用的http://stackoverflow.com/questions/215497/in-java-whats- public-default-protected-and-private之間的區別 – Vahx 2015-04-04 17:37:46

回答

3

當你說'發現任何類在導入正確的package.class文件後仍然可以使用構造函數。'我想你正在談論反思。 反射是一個強大的概念,允許類的任意實例化,即使它們只提供私有構造函數。 沒有辦法阻止某人使用反射來實例化你的類。類或構造函數修飾符(如private或protected)可以繞過使用反射。

+0

看起來,將類的訪問修飾符聲明爲package visible可以解決我的問題。感謝您的輸入! – drx 2015-04-04 17:47:29

+0

使用Class.forName(「package.subpackage ... className」),您仍然可以獲取包私有類的Class對象。通過這種方式,您可以獲取已聲明的構造函數,使其可訪問,並且只需調用它們即可獲得所需類的實例。 – muued 2015-04-04 17:57:06

1

如果你想從外部類控制類的實例,那麼你可以創建它的構造private像 -

class A{ 

    private A(){ 
     // do some thing 
    } 

    public static getInstance(){ 

    } 
} 

現在,現在的A類的實例可以創建表格之類的外。但是如果外界真的需要類的一個實例,那麼他們可以使用靜態方法getInstance()。這種構造可以防止外界使用new關鍵字創建類的實例。

希望它會幫助。
謝謝。

+0

非常豐富,謝謝! – drx 2015-04-04 17:50:56