2011-05-24 81 views
0

在這裏具體場景,Singleton設計與新對象裏面

我有一個馬槽稱爲UserManger用於處理CRUD用戶

這個經理是「單身」和正確的設計。

但在更新的方法我有邏輯

public User update (User u) 
{ 

    // This line is problematic? 
    User u1 = new User(); 

    copy(u,u1); 
    //Some logic 
    dao.update(u); 

} 

將創造單經理任何新對象有問題?特別是對於非常併發的系統。

public User update (User u, User u1) 
{ 

    copy(u,u1); 
    //Some logic 
    dao.update(u); 
} 

解決我的問題?

+0

u和u1包含什麼 – developer 2011-05-24 06:27:12

+0

u&u1是User類的對象。用戶類是簡單的dto,它具有用戶屬性(如名稱,年齡等)的獲取者和設置者。 – 2011-05-24 06:36:04

回答

4

只需在單例方法中創建一個對象不會導致任何問題。畢竟,你並沒有在線程之間共享任何狀態。

您將有潛在的問題,如果你單身本身有狀態 - 但你已經證明一切正在創造一個本地變量,而不是改變實例變量。每個方法的調用都有自己完全獨立的一組局部變量。兩個線程都可以執行相同的方法,但他們不會看到彼此的局部變量。

+0

好吧,這是否意味着如果我改變類似u1.setId(u.getId())的東西;或u1.generateXYZ(u.getID());那麼它會有問題嗎? – 2011-05-24 06:35:10

+0

@Amol:不,因爲這仍然不是單身人士的狀態,是嗎? – 2011-05-24 06:36:14

+0

@Jon但是新創建的對象內部的值是使用參數化對象設置的,所以我認爲使用這樣的邏輯可能是一個問題? – 2011-05-24 06:46:19

0

不可以,但如果你把

User u1; 

爲全局變量,它會引起問題。

但我有個問題,爲什麼不用這種方式編碼?

public User update (User u) 
{ 

    //Some logic 
    User u = dao.update(u); 
    return u; 
    // OR return dao.update(u); 
} 

你不需要複製到這裏。在此方法中,拷貝需要爲User對象分配兩次以上的內存。

+0

它在Java中不被稱爲*全局變量*。 ;)* Field *,* attribute *,* property *(sans getter和setter方法)或* class variable *是一個更加一致的名稱。 – Spoike 2011-05-24 06:39:42

+0

是的。在這裏你是正確的,但是這裏的副本是業務邏輯的一部分,所以不能避免。但創建任何對象並在這種更新方法中使用它們會導致任何問題,當新創建的對象的值受到作爲參數傳入的對象的值的影響時? – 2011-05-24 06:43:13

+0

@Amol:不,它很安全。 – Rudy 2011-05-24 06:59:36

0

不瞭解您的系統,我不得不打電話質疑這裏描述的設計模式。 SingletonSomethingManager都是反模式。

您可能只需要爲UserManager考慮一個更具描述性的名字,但我會強烈建議使用IoC框架像Spring注入它在那裏需要,而不是釘下來作爲一個「全球性」(基本上是什麼一個單身人士)。

+0

我不確定你爲什麼認爲Singleton是反模式。你知道Spring中bean的默認範圍是singleton嗎? :P – Rudy 2011-05-24 08:40:24

+0

@Rudy閱讀鏈接,瞭解它爲什麼是反模式。還有幾個其他頁面可以很好地描述它:http://blogs.msdn.com/b/scottdensmore/archive/2004/05/25/140827.aspx http://www.butunclebob.com/ArticleS.UncleBob.SingletonVsJustCreateOne **但是**你也將Singleton作爲單例模式從Spring中作爲單例模式。它們與Spring的範圍並沒有將範圍硬編碼到類中非常不同。 – 2011-05-24 10:50:56