Java 为什么要创建函数Add?

Java 为什么要创建函数Add?,java,c#,Java,C#,这里的大多数专家程序员都认为我的答案是错误的 因此,我想知道为什么我需要创建另一个函数Add,将项目添加到我的列表中。大多数编程语言,如JavaC#和VB.NET允许我们使用一种非常简单的方法,使用Getter作为列表或数组列表,我们可以添加和使用该类直接拥有的许多函数,如下示例所示 C# 类程序 { 静态void Main(字符串[]参数) { 员工emp=新员工(); emp.lst.Add(“你好”); } } 班级员工 { 私有列表_lst=新列表(); 公共列表lst { 获取{re

这里的大多数专家程序员都认为我的答案是错误的

因此,我想知道为什么我需要创建另一个函数
Add
,将项目添加到我的列表中。大多数编程语言,如
Java
C#
VB.NET
允许我们使用一种非常简单的方法,使用
Getter
作为列表或数组列表,我们可以添加和使用该类直接拥有的许多函数,如下示例所示

C#

类程序
{
静态void Main(字符串[]参数)
{
员工emp=新员工();
emp.lst.Add(“你好”);
}
}
班级员工
{
私有列表_lst=新列表();
公共列表lst
{
获取{return}
}
//公共无效添加(字符串项){
//添加(项目);
//}
}
爪哇

public类MainApp{
公共静态void main(字符串[]args){
员工emp=新员工();
emp.getLst().add(“我的字符串”);
}
}
班级员工{
private List lst=new ArrayList();
公共列表getLst(){
返回lst;
}
公共无效集合lst(列表lst){
这是1.lst=lst;
}
}

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

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

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


例如,如果对象是具有原始列表的普通数据传输对象,则在该对象中没有问题,但如果对象是
学生
公开可修改的类列表,则如果单独存储例如总分类,则很容易导致状态不一致

这是一种称为封装的OOP技术,在某些情况下不需要它。回答正确!=有用的答案(这是推动投票的因素)。如果你想讨论为什么你的原始答案被否决,最好在Meta上这样做。所以我需要写一些方法,我要一直访问我的CRUD列表,这是最佳实践吗?这是最佳实践。为了可读性。封装的目的是让类(
Employee
)完全控制其成员值。如果它返回
列表本身,并允许调用方修改该列表,那么您已经破坏了封装,因为该类不再控制。例如,恶意调用方可以将列表分配给原始
列表
变量,然后添加
整数
对象。或者,如果
Employee
希望确保值不能为null或空字符串,则
add()
方法可以验证这一点,但如果调用方可以直接修改列表,则不能验证。
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;
       }
   }