2016-09-29 26 views
1

我有一個Order類,如下圖所示:重用Java類對象的

public class Order { 

    private List<OrderLine> orderLines = new ArrayList<OrderLine>(); 


    public void add(OrderLine o) throws Exception { 
     if (o == null) { 
      System.err.println("ERROR - Order is NULL"); 

     } 
     orderLines.add(o); 
    } 
    public void clear() { 
     this.orderLines.clear(); 

    } 
} 

現在我的主要我想使用的順序和更新列表中的一個變量並打印輸出

我的主類代碼:

public static void main(String[] args) throws Exception { 

     Map<String, Order> allOrders = new HashMap<String, Order>(); 

     //Build Order 1 
     Order order = new Order(); 
     order.add(new OrderLine(new Item("book", (float) 12.49), 1)); 
     order.add(new OrderLine(new Item("Pen", (float) 14.99), 1)); 

     allOrders.put("Order 1", order); 
     order.clear(); 



     //Build Order 2 

     // Reuse cart for an other order 


     order.add(new OrderLine(new Item("imported box of chocolate", 10), 1)); 
     order.add(new OrderLine(new Item("perfume", (float) 47.50), 1)); 
     allOrders.put("Order 2", order); 
     order.clear(); 
} 

在這裏,我創建了訂單對象和addign細節之一,在對象和更新加入這list.Now結算數據具有新訂單細節但第一訂單細節的對象也用二階細節更新。我認爲訂單對象是通過參考傳遞的。如何實現對象重用,避免通過參考並具有所有訂單明細?

Regards, Nagasree。

+0

的[可能的複製就是Java「通過逐引用「或」按值傳遞「?](http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value) –

+0

Java是,並將永遠傳遞價值。 http://javadude.com/articles/passbyvalue.htm – QBrute

+0

我不相信你對你的答案做了足夠的研究,問題很簡單 –

回答

1

如果多次將同一個Order實例添加到Map,則Map中的所有值都將相同。

與其說clear()的,創建一個新的Order

更換

order.clear(); 

order = new Order(); 

它將使意義,如果你沒使用重用單個對象的你範式將該對象添加到Map

例如,你可以使用一個StringBuilder實例產生String s表示將被添加到Map

Map<Integer,String> map = new HashMap<>(); 
StringBuilder sb = new StringBuilder(128); 
sb.append("one"); 
map.put(1,sb.toString()); 

sb.setLength(0); // equivalent to your clear() 
sb.append("two"); // reuse same StringBuilder instance 
map.put(2,sb.toString()); 
+0

實際上挑戰並不是創造秩序的另一個對象並實現。我想可能是我錯過了一些java的概念。 – NAGASREE

+0

@NAGASREE如果您必須在'Map'中放置'Order'實例的值,則不能使用單個'Order'對象。如果你只想打印這些命令所代表的數據,你可以使用一個'Order'實例,但是將'Map'放入order.toString()'(假設你的Order類重寫'toString()'。 – Eran

+0

謝謝你的解釋。 – NAGASREE

-1

你需要像Singleton

或者僅僅做到這一點:

order = new Order(); 
+0

單身正好和你第二個建議相反 –

0
  • 你爲你的訂單創建一個對象。

  • 你把這個對象在一個列表

  • 你修改同一對象

  • 你(再)把這個相同的對象列表中的

- >您的列表中包含2倍同一物體

其實:

更新與新訂單的詳細信息對象

應該

更新對象與另一訂單細節