我为什么要创建函数Add?

时间:2017-03-31 03:46:47

标签: java c#

这里的大多数专家程序员都把我的答案投票给了不好的答案

  

How to add a field to an ArrayList from a different class?

所以,我想知道为什么我需要创建另一个函数Add来将项目添加到我的列表中。虽然大多数编程语言(例如Java C#VB.NET允许我们使用Getter作为List或ArrayList,但我们能够添加和使用许多该类直接作为样本的函数

C#

class Program
{
    static void Main(string[] args)
    {
        Employee emp = new Employee();
        emp.lst.Add("Hello");
    }
}
class Employee
{
    private List<string> _lst = new List<string>();

    public List<string> lst
    {
        get { return _lst; }
    }
    //public void add(String item) {
    //    _lst.Add(item);
    //}
}

爪哇

    public class MainApp {
        public static void main(String[] args){     
            Employee emp = new Employee();
            emp.getLst().add("My String");
        }
    }

    class Employee{
       private List<String> lst = new ArrayList<String>();

       public List<String> getLst() {
            return lst;
       }
       public void setLst(List<String> lst) {
           this.lst = lst;
       }
   }

大多数语言允许我们这样做。那么,我需要为Employee创建函数Add的原因是什么?

1 个答案:

答案 0 :(得分:1)

实际原因:getList()可能会返回该列表的内部列表或副本。如果不知道getList()的实现(或者不太可能查找和阅读特定类的特定方法的文档),类的消费者就无法知道方法的行为是什么。因此,以任何其他方式添加或修改getList()调用的结果可能永远不会更改原始对象,并且证明正确性将需要阅读所有代码,包括getList()的(通常是私有的)实现。

是否有必要公开单独的方法以添加到列表中是否是基于特定代码的个人选择。通常,最好为对象上的所有操作提供特定方法,因为可以保证对象状态的一致性。

例如,如果对象是具有原始列表的普通数据传输对象,那么如果它是Student,则暴露可修改的类列表可能容易导致不一致的状态,例如,如果例如总分类被独立存储。