在哪些场景中你使用封装?

时间:2010-09-19 03:16:08

标签: java oop encapsulation

我想知道你在什么情况下使用封装。此问题的目的是协作。因此,当主题被封装时,请随意分享您自己的经验。

有些情况:

计算属性

public class Order {

    private List<ListItem> listItems = new ArrayList<ListItem>();

    public double getTotal() {
        double total = 0;
        for(ListItem listItem: listItems)
            total += listItem.getQuantity() * listItem.getPropduct().getPrice();

        return total;
    }

}

自我验证域对象

public class Person {

    private String name;

    public void setName(String name) {
        if(StringUtils.isBlank(name)) {
            throw new NotEmptyException("name", name);
        }

        this.name = name;
    }

}

将某种特殊行为用于其他类别

public class Person {

    private MutableInt id = new MutableInt();

    /**
      * Integer itself is immutable
      */
    public Integer getId() {
        retur id.intValue();
    }

}

转换

public class Person {

     public String enabled;

     public boolean isEnabled() {
         return "Y".equals(enabled);
     }

}

2 个答案:

答案 0 :(得分:4)

简单地说,我更喜欢在我设计/实现的所有非私有API中使用强封装。

习惯上不使用强封装的唯一情况是使用私有嵌套类,这些嵌套类比ersatz struct声明更多(并且需要)。我的理由是私有类通过嵌套和私有来充分封装。

如果有令人信服的性能原因,我也准备放松封装(一点点)。当复制它们的成本过高时,这种放松通常包括泄漏内部数组/集合。这总是让我感到不舒服......

答案 1 :(得分:0)

当存在用户可以搞砸的场景时,我进行了封装。例如,如果我正在编写一个显示文本的类,我不会封装我持有字符串的事实,因为任何字符串都有效显示。

存在用于验证和界面更改的封装。如果你有一个不需要验证的参数(并且接口是明确定义的),那么封装它是没有意义的,特别是如果你使用的语言没有任何内置工具,比如Java(工具)例如,C#属性)。

封装是一种与其他工具一样的工具,不应该因为你可以在任何地方被抛出。