0

チェックインスタンスが他のインスタンスと等しい場合、私は得る

java.lang.StackOverflowError.

双方向の関係があるため、私のOverride equal method呼び出しはequal()相互に再帰的に機能します。片側のチェックイコール条件を 1 つ削除する必要がoverride equal methodありますか? より良い方法は何ですか?一部の PG はEqualsBuilder、Apache の使用を提案しています。

OrderItem.java

 public class OrderItem {
            private String id;
            private Order order;

            public OrderItem(String id, Order order) {
                this.id = id;
                this.order = order;
            }

            public void setId(String id) {
                this.id = id;
            }

            public String getId() {
                return id;
            }

            public void setOrder(Order order) {
                this.order = order;
            }

            public Order getOrder() {
                return order;
            }

            @Override
            public boolean equals(Object object) {
                if (this == object) {
                    return true;
                }
                if (!(object instanceof OrderItem)) {
                    return false;
                }
                final OrderItem other = (OrderItem)object;
                if (!(id == null ? other.id == null : id.equals(other.id))) {
                    return false;
                }
                if (!(order == null ? other.order == null : order.equals(other.order))) {
                    return false;
                }
                return true;
            }
        }

注文.java

        public class Order {
            private String id;
            private List<OrderItem> orderItemList;

            public Order(String id) {
                this.id = id;
            }

            public void setId(String id) {
                this.id = id;
            }

            public String getId() {
                return id;
            }

            public void setOrderItemList(List<OrderItem> orderItemList) {
                this.orderItemList = orderItemList;
            }

            public List<OrderItem> getOrderItemList() {
                return orderItemList;
            }

            @Override
            public boolean equals(Object object) {
                if (this == object) {
                    return true;
                }
                if (!(object instanceof Order)) {
                    return false;
                }
                final Order other = (Order)object;
                if (!(id == null ? other.id == null : id.equals(other.id))) {
                    return false;
                }
                if (!(orderItemList == null ? other.orderItemList == null : orderItemList.equals(other.orderItemList))) {
                    return false;
                }
                return true;
            }
        }

テスト

        public static void main(String[] args) {
            Order order1 = new Order("1");
            List<OrderItem> orderItemList = new ArrayList<OrderItem>();
            orderItemList.add(new OrderItem("1", order1));
            orderItemList.add(new OrderItem("2", order1));
            order1.setOrderItemList(orderItemList);


            Order order2 = new Order("1");
            List<OrderItem> orderItemList2 = new ArrayList<OrderItem>();
            orderItemList2.add(new OrderItem("1", order2));
            orderItemList2.add(new OrderItem("2", order2));
            order2.setOrderItemList(orderItemList2);

            if(order1.equals(order2)) {
                System.out.println("Equal");
            } else {
                System.out.println("Not Equal");
            }
        }
4

1 に答える 1

0

id等価性チェックに属性のみを使用するように書き直します。ただし、これは重要hashcode()です。Javaコレクションでエンティティを正しく動作させる場合は、メソッドもオーバーライドすることを忘れないでください。

于 2012-09-24T09:57:58.270 に答える