日期:2014-05-20  浏览次数:20670 次

分享 - 小问题大道理,你是否在意过
只是拿了一个比较典型的例子(订单),类似这种例子非常的多。当然不是说适用于所有的情况。
只是刚才回帖之后,一时兴起拿出来与大家做一个小的分享。不知道对你是否有用。
Java code

public class Order {
    
    private String name;
    //
    private Set<OrderLine> orderLines = new HashSet<OrderLine>();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    /**
     * 因为这是一个domain对象,贯穿你整个项目,不知你是否在意过这样的设计。
     * 这样的设计对你是否有用呢?
     * 用户:表示API调用者。 
     */
    
    public Set<OrderLine> getOrderLines() {
        /*
         * 1.防止用户任意修改订单行的内容,强制要求用户使用当前类提供的API修改订单行
         * 2.getOrderLines()绝对不为null,有可能getOrderLines().isEmpty()为true
         * 用在你的程序中不会出现if(getOrderLines() == null && getOrderLines().isEmpty()),
         * 只会出现if(getOrderLines().isEmpty())
         */
        return Collections.unmodifiableSet(orderLines);
    }

    //-----------------------提供API修改Order by OrderLine----------------------------//
    public void addOrderLine(OrderLine orderLine) {
        //
        orderLines.add(orderLine);
    }

    public void removeOrderLine(OrderLine orderLine) {
        // ...
    }
    //-----------------------提供API修改Order by OrderLine----------------------------//
    
    public void setOrderLines(Set<OrderLine> orderLines) {
        // this.orderLines = orderLines;
        // 为什么没有向上面来做,是因为如果是这样赋值的话那么两个对象就是同一个引用了。
        // 用户修改orderLines,this.orderLines也同样会被修改。
        // 而提供这个类期望用户通过该类提供的接口来修改orderLines。
        orderLines.addAll(orderLines);
    }

}



------解决方案--------------------
谢谢楼主分享!
------解决方案--------------------
分享精神 不错
------解决方案--------------------
探讨

得到了一个不可更改的副本?

------解决方案--------------------
这种问题已经习惯成自然了
LZ再把线程安全的情况考虑进去就更好了

------解决方案--------------------
READ IT AGAIN
“用在你的程序中不会出现if(getOrderLines() == null && getOrderLines().isEmpty()),”
当然不可能出现,只可能出现NPE,如果出现true的话,那就是getOrderLines()方法不是幂等的。

另外,建议使用linkedhashset,以保持顺序。同时,考虑是否有多线程问题。单单这一段代码,在多线程下面会有问题
------解决方案--------------------
好问题。
------解决方案--------------------
Java菜鸟学习了。
Java code

return Collections.unmodifiableSet(orderLines);