代码之家  ›  专栏  ›  技术社区  ›  user257111

关于私有数组列表和其他此类构造的最佳实践

  •  4
  • user257111  · 技术社区  · 14 年前

    我有下面的课程,我正在为如何实现而斗争。问题是拥有一个私有集合项(在本例中是arraylist)和一个成员是否有意义。我很清楚,为任何类成员提供getter和setter被认为是最佳实践,但在这种情况下,拥有getter和setter将需要重新实现(或者说复制)大量的ArrayList功能。

    示例类:

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

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

    3 回复  |  直到 13 年前
        1
  •  5
  •   Community CDub    8 年前

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

    我宁愿用以下方式来处理:

    1. 将类型更改为 List<String> (在字段上使用接口的最佳实践。)
    2. 初始化空的 ArrayList
    3. 提供代表 add , remove , hasTo/Cc/Bcc .

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

    编辑

    the other answer on considering to returning an unmodifiable List .

        2
  •  6
  •   Justin Ardini    14 年前

    我很清楚这被认为是最好的 练习有干将和二传手 任何班级成员。

    ArrayLists . 任何使用你的类的人都不应该知道你在内部使用 阵列列表 . 除非绝对必要,否则你不应该为你的工作提供一个干劲 . 如果你觉得你需要这些,可以考虑退货 List 以及使用 Collections.unmodifiableList() 防止通过吸气剂改性。

        3
  •  2
  •   Stephen C    14 年前

    这是不正确的。

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

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

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

    另一个需要考虑的问题是,是否有性能要求使得有必要回避“最佳实践”设计原则,并故意使ADT“泄漏”。

    推荐文章