2012-09-04 55 views
1

我想知道什麼是最好的做法,當涉及到類初始化,Java對象初始化多次在一個類中或只是一次?

我的意思是,我應該在頂層初始化類一次Customer c = new Customer();,並在課堂上任何地方使用它:

Tools tools = new Tools(); 
    public boolean doCIdCheck(int cId) { 
     final Iterator<Customer> cursor = tools.Customers.iterator(); 
     while (cursor.hasNext()) { 
      if (cursor.next().getCIdCheck(cId)) { 
       return true; 
      } 
     } 
     return false; 
    } 

或者我應該只使用new Customer().checkCId();過的位置,我需要它:

public boolean doCIdCheck(int cId) { 
     final Iterator<Customer> cursor = new Tools().Customers.iterator(); 
     while (cursor.hasNext()) { 
      if (cursor.next().getCIdCheck(cId)) { 
       return true; 
      } 
     } 
     return false; 
    } 

或者最好有每個函數/方法有它自己的類的實例:

public boolean doCIdCheck(int cId) { 
     Tools tools = new Tools(); 
     final Iterator<Customer> cursor = tools.Customers.iterator(); 
     while (cursor.hasNext()) { 
      if (cursor.next().getCIdCheck(cId)) { 
       return true; 
      } 
     } 
     return false; 
    } 
+0

它幾乎取決於你想要達到的目標,導致這些解決方案爲少量你絕對不同的效果。 – Egor

+0

嗯,我們只是說..我有一個工具類與一大堆用戶輸入的驗證方法...所以說我的客戶類使用這些驗證,以確保用戶輸入遵循規則..所以什麼是最好用的: 新工具()._ entryStringOnly(); 在我需要驗證的每個地方。 或在頂部創建實例Tools Tools = new Tools(); 然後使用工具。_entryStringOnly(); 在我需要驗證的每個地方。 或創建每個函數/方法與自己的實例使用該功能/方法 – RcK

+0

好的錯誤我想知道的是...我已經提到的最好的做法是病態需要在每個類的方法()。 ..需要知道的副作用喜歡做內存管理/速度等 – RcK

回答

0

考慮到,你將需要的每一個方法的對象並考慮到只有內存管理和處理器消耗,然後:

1.選項1(保持一個全局變量無處不在):內存你如果您擁有大量這些對象,鼠尾草將會增加,因爲您將爲每個工具實例存儲額外的客戶對象。這將使您獲得處理器速度,因爲您不必爲每種方法創建和銷燬客戶對象。

2.Option 2:(保持一個Customer對象只能在方法訪問):內存的使用會降低你的應用程序將變得更加處理器密集型,你將創建和每個方法被訪問時銷燬對象。

IMO如果實例化工具的很多對象,然後去選擇2否則,如果僅當工具的對象存在去選擇1

+0

非常感謝..我正在尋找的東西想知道創建反對創建一個實例並在每個位置使用它們的許多實例的副作用。 – RcK

0

這取決於您的要求。例如,如果您不想在方法doCIdCheck之外使用類Tools,則優選第三個選項。

+0

所以嗯..它並不重要?我已經提到,在客戶類中幾乎所有地方都需要使用Tools類......所以...想知道創建新實例的效果,在這些實例中,每個需要或使用在頂級創建的實例管理或應用程序的速度。 – RcK

1

從你的榜樣,它看起來像最好的辦法是到Tools共享的方法和成員聲明爲static,而不是創建一個實例,只是稱他們爲

final Iterator<Customer> cursor = Tools.Customers.iterator(); 

這當然假定您不會在可能導致衝突的Tools中存儲數據,在這種情況下,首選創建多個實例。

+0

謝謝,我確實有這個..我只是改變了這個例子中的東西,所以你們得到了我想要的所有我的集合是靜態的,我確實按照你描述的方式使用它們。 – RcK

0

您可以覆蓋equals()方法來檢查cid中的等於CustomerExample

然後,而不是這些循環可以使用contains()Collection方法

所以你doCIdCheck方法看起來就像

public boolean doCIdCheck(Customer cId) { 
    Tools tools = new Tools();// I don't know if you are initializing list 
           // in Tools constructor or not but it should 
           // be initialized in constructor or in declaration 
    return tools.customers.contains(cId); 
} 
+0

虐待它,看到謝謝...以及說實話,我想知道一般什麼是最好的方式來使用實例..這已經被MaVRoSCy回答基本上想知道什麼創建多個實例或創建一個實例無處不在。 – RcK

+0

嗯...我不認爲這會工作,也許我做錯了什麼..基本上用戶輸入一個客戶ID(INT),然後它會檢查ID是否存在...我試過你的方式,但嗯..我不知道什麼論據應該傳遞給(int)?因爲它顯示錯誤,並說預期:客戶發現:int – RcK

+0

'新客戶(cId)'創建一個構造函數,它將接受cId並將其分配給變量。然後,您可以將參數作爲Customer轉換爲非int –