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

Java 在哪些场景中使用封装?,java,oop,encapsulation,Java,Oop,Encapsulation,我想知道在什么情况下使用封装。这个问题的目的是协作。因此,当主题是封装时,请随意分享您自己的经验 一些场景: 计算属性 public class Order { private List<ListItem> listItems = new ArrayList<ListItem>(); public double getTotal() { double total = 0; for(ListItem listItem: l

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

一些场景:

计算属性

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

}

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

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


如果有令人信服的性能原因,我也准备放松封装(稍微)。这种放松通常包括在复制成本过高时泄漏内部数组/集合。而且这样做总是让我感到不舒服…

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

存在用于验证和接口更改的封装。如果您有一个不需要验证的参数(并且接口定义良好),那么封装它就没有意义了,特别是如果您使用的语言没有任何内置工具,比如Java(工具是C#properties)


封装是一种与其他工具一样的工具,不应该因为可以而到处乱扔。

+1 Nivas。回复:结构。我发现,每次我使用结构而不是类时,我最终不得不将结构撕下,并用类替换它。回复:性能。我的代码中的性能问题99%都涉及数据库访问。我从未遇到过由普通Java代码引起的性能问题。您的
isEnabled
方法可以缩短为
返回“Y”。等于(已启用)
public class Person {

     public String enabled;

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

}