2016-09-29 3 views
1

나는 클래스 주문이 있습니다재사용

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(); 

    } 
} 

이제 출력을

내 주를 위해 업데이트 목록의 하나 개의 변수를 사용하여 인쇄 할 내 주에 클래스 코드 : 여기에 내가 주문 객체와 addign 세부 사항 중 하나 생성하고 객체 및 업데이트에 list.Now 용지에 데이터를이를 추가하고

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(); 
} 

새로운 주문 세부 사항을 가진 객체지만 첫 번째 주문 세부 사항도 두 번째 세부 사항으로 업데이 트됩니다. 나는 주문 개체 참조로 통과 생각합니다. 어떻게 참조 재현을 피하고 모든 주문 세부 사항을 피하기 위해 객체 재사용을 달성 ??

감사합니다. 나가 서리.

+0

가능한 중복 자바가 "통과 부산물 참조 "또는"패스 바이 값 "?] (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의 모든 값이 동일하게됩니다.

그것은 당신이 didn를하는 경우 하나의 객체를 재사용의 패러다임을 사용하는 것이 나을

order.clear(); 

order = new Order(); 

로 교체 :

대신 clear()를 호출하는 새로운 Order 생성 그 객체를 Map에 추가하십시오.

예를 들어, Map에 추가 될 것입니다 String의 생성하는 하나의 StringBuilder 인스턴스를 사용할 수 있습니다

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

실제로 도전은 다른 주문의 대상을 만들어서 성취하지 않는다. 나는 자바의 개념을 놓치고있다. – NAGASREE

+0

@NAGASREE'Order' 인스턴스에'Map' 값을 넣어야한다면, 하나의'Order' 객체를 사용할 수 없습니다. 이 order에 의해 표현 된 데이터만을 출력하고 싶다면, 하나의 Order 인스턴스를 사용할 수 있지만,'Map'' order.toString()'을 사용하면된다. (Order 클래스가'toString()'을 오버라이드한다고 가정하자.) – Eran

+0

설명 주셔서 감사합니다. – NAGASREE

-1

당신은 Singleton

같은 필요하거나 할을한다 :

order = new Order(); 
+0

싱글 톤은 정확히 두 번째 제안과 반대입니다. –

0
  • 주문에 대한 객체를 생성합니다.> 목록에 포함 -

  • 당신은 당신이

    이 가

    당신은 (재) 목록에이 같은 객체를 넣어

  • 이 같은 개체를 편집 목록

  • 에서이 객체를 넣어 동일한 대상의 2 배

    사실 :

    다른 주문 세부

    와 객체를 업데이트

    해야 새 주문 세부 사항을 가진 개체를 업데이트

    [의