我有以下课程,我正在争取如何实施。问题在于是否有一个私人收藏项目,在这种情况下是一个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问题,设计模式等我应该考虑的方向吗?
答案 0 :(得分:6)
我很清楚它被认为是最好的 练习有吸气剂和二传手 任何班级成员。
我不同意。只暴露你需要的东西!尝试用ADT(抽象数据类型)来思考。换句话说,从内部ArrayLists
创建一个抽象层。使用您班级的任何人都不应该知道您在内部使用ArrayLists
。除非绝对必要,否则您不应为ArrayLists
提供吸气剂。如果您觉得需要这些,请考虑返回List
并使用Collections.unmodifiableList()
来防止通过getter进行修改。
答案 1 :(得分:5)
实际上在这种情况下,我认为不提供直接的getter / setter组合会更好。
我宁愿以下列方式接近它:
List<String>
(在字段上使用接口的最佳做法。)ArrayList
。add
,remove
,hasTo/Cc/Bcc
。通过这种方式,您可以使用其他功能来装饰每个集合,例如:确保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“漏洞”的性能要求。