关于私人arraylist和其他此类结构的最佳做法

时间:2010-08-22 22:46:10

标签: java collections arraylist class-design

我有以下课程,我正在争取如何实施。问题在于是否有一个私人收藏项目,在这种情况下是一个arraylist,一个成员。我很清楚,对于任何类成员都有getter和setter被认为是最佳实践,但在这种情况下,使用getter和setter需要重新实现(或者更确切地说是重复)大量的ArrayList功能。

示例类:

public class Email
{
    private ArrayList<String> To;
    private ArrayList<String> Cc;
    private ArrayList<String> Bcc;

    ...
}

我假设答案是我应该为这些数组实现getter和setter吗?在处理这种情况时,我有没有想过的方法?管理这些列表的简单方法是将私有修饰符设置为public并检查数组数据在调用方法时是否有效,但这是正确的吗?任何人都可以指出我的其他SO问题,设计模式等我应该考虑的方向吗?

3 个答案:

答案 0 :(得分:6)

  

我很清楚它被认为是最好的   练习有吸气剂和二传手   任何班级成员。

我不同意。只暴露你需要的东西!尝试用ADT(抽象数据类型)来思考。换句话说,从内部ArrayLists创建一个抽象层。使用您班级的任何人都不应该知道您在内部使用ArrayLists。除非绝对必要,否则您不应为ArrayLists提供吸气剂。如果您觉得需要这些,请考虑返回List并使用Collections.unmodifiableList()来防止通过getter进行修改。

答案 1 :(得分:5)

实际上在这种情况下,我认为不提供直接的getter / setter组合会更好。

我宁愿以下列方式接近它:

  1. 将类型更改为List<String>(在字段上使用接口的最佳做法。)
  2. 在构造函数中初始化一个空的ArrayList
  3. addremovehasTo/Cc/Bcc
  4. 提供代表

    通过这种方式,您可以使用其他功能来装饰每个集合,例如:确保String包含有效的收件人信息。

    public void addTo(String recipient){
      // validate recipient
      this.to.add(recipient);
    }
    
    public String removeTo(String recipient){
      return this.to.remove(recipient);
    }
    
    public boolean hasTo(){
      return this.to.size() > 0;
    }
    

    修改

    我忘了提到一个getter是有道理的,因为你在处理电子邮件时需要它。但请看the other answer on considering to returning an unmodifiable List

答案 2 :(得分:2)

  

我很清楚,对于任何班级成员来说,拥有getter和setter是最佳做法。

这是不正确的。

相关的“最佳实践”建议不是将类状态公开为字段。

如果确实需要使状态可见,则getter和setter是一个选项,但不一定是最合适的选项。在决定哪种选择最佳时,您需要考虑以下问题:

  • 状态是我公开了ADT的内部实现细节,还是对单独数据实体的引用?

  • 如果我公开内部实施细节,我该如何根据它来防止某些事情,或者(更糟糕的是)以可能具有破坏性的方式改变它?

良好实施的getter和setter可以解决这些问题;例如通过返回集合的副本或不可修改的包装器,和/或通过复制集合参数。但是包装器方法可以做同样的事情,通常会减少运行时开销。

另一件需要考虑的事情是,是否存在必须避免“最佳实践”设计原则并故意使ADT“漏洞”的性能要求。