2012-08-08 19 views
-1

我有一類是低於一..關於單設計不良

public class DataBaseDAO { 
    private DataBaseDAO() { } 
     public static synchronized DataBaseDAO getInstance() { 
      if (dao == null) { 
       dao = new DataBaseDAO(); 
       } 
      return dao; 
      } 
     } 
    } 

現在這個getInstance()方法可以被黑客攻擊:換句話說,這單可以被黑客入侵,並可以創建更多的對象。

我該如何確保安全?
這可以通過反思,classloaders和deserilizaton來打破。
我應該去同步塊,而不是整個方法同步?
它會影響性能嗎?

謝謝大家,實際上我不想介紹新的枚舉,因爲在現有的結構中,然後會發生很多變化,我正在尋找如何改進現有的SINGLETON與當前類本身的方法..! !

+2

看看[在Java中使用Enum作爲單例的最佳方法是什麼?](http://stackoverflow.com/questions/427902/what-is-the-best-approach-for-using -an-enum-as-a-singleton-in-java) – maba 2012-08-08 15:12:15

+0

[Enum是在Java中實現單例的最好方法。] [1] 注:單身人士通常被認爲是不好的做法。 [1]:http://stackoverflow.com/questions/70689/what-is-an-efficient-way-to-implement-a-singleton-pattern-in-java – 2012-08-08 15:12:37

+0

而不把你的getInstance方法在構造函數中,因爲這樣它不能編譯 – 2012-08-08 15:13:09

回答

2

你可以做同樣的更安全與

public enum DataBaseDAO { 
    INSTANCE 
} 

例如您可以使用反射來使用setAccessible(true)的私有構造函數,但不會創建新的枚舉實例。

而不是

DataBaseDAO.getInstance().whateverMethod() 

可以使用

DataBaseDAO.INSTANCE.whateverMethod() 
+1

請你解釋一下,因爲在我的設計中,單身人士正在返回dao ..!1 – user1582269 2012-08-08 16:13:30

+1

新增了一個例子。有時它非常簡單,你可能會錯過它。 ;) – 2012-08-08 17:05:46

0
+2

爲什麼他*需要*使用**雙重檢查鎖定,單例模式**? – maba 2012-08-08 15:15:08

+0

當您不想讓整個方法同步時,該模式只是一種性能改進。它不能保證課程的安全。 – tibtof 2012-08-08 15:17:08

+0

你是對的,它沒有連接到反射,類加載器和deserilizaton ...與PARANOID ENGINEERING有關的問題...我發送一個答案給其他問題...(如何在多線程環境中創建工作單例) – prilia 2012-08-08 15:18:19

0

以下3種方法都是安全的,前兩個通過類加載機制,最後一個通過同步。

除非您使用SecurityManagers,否則您無法保護自己不受影響,我認爲這很複雜。

另注:請不要使用單身;-P

class YourClass 
{ 
    public static final YourClass instance = new YourClass(); 
} 

// or 

class YourClass2 
{ 
    private static final YourClass2 instance = new YourClass2(); 

    public static synchronized YourClass2 getInstance() 
    { 
     return instance; 
    } 
} 

// or 

class YourClass3 
{ 
    private static YourClass3 instance; 

    public static synchronized YourClass3 getInstance() 
    { 
     if (instance == null) 
      instance = new YourClass3(); 
     return instance; 
    } 
} 
1

其實你應該有關獲取你的單身擔心砍死。一般來說,單身人士被認爲是一種糟糕的(過時的)設計實踐(他們傾向於採用超聲波或以後的方式,導致可擴展性問題並使測試不必要地變得複雜)。

你已經定義了一個明確的訪問方法,它不是你的責任(作爲設計者或程序員)來防止聰明的黑客走出他的方式濫用你的單身人士。有項目準則來防止這種情況發生。