覆盖等方法和双向关系

时间:2012-09-24 09:50:08

标签: java stack-overflow

当检查实例与其他实例相同时,我得到

java.lang.StackOverflowError

由于存在双向关系,这就是为什么我的Override equal method调用equal()以递归方式相互作用。 我应该在一侧的override equal method中删除一个检查相同的条件吗? 什么会更好的方式?有些PG建议我使用Apache的EqualsBuilder

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

Order.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");
            }
        }

1 个答案:

答案 0 :(得分:0)

我会将其重写为仅使用id属性进行相等性检查。但这是重要:如果您希望实体在Java集合中正确运行,请不要忘记覆盖hashcode()方法。