java类中集合属性和对象属性的getter和setter的最佳实践

java类中集合属性和对象属性的getter和setter的最佳实践,java,properties,getter-setter,Java,Properties,Getter Setter,我有以下实现 public class PartGroup { private Part iPart; private ArrayList<Part> iParttList; public Part getPart() { return iPart; } public void setPart( Part aPart ) { iPart = aPart; } public ArrayList<Part

我有以下实现

public class PartGroup {

   private Part iPart;

   private ArrayList<Part> iParttList;

   public Part getPart() {
      return iPart;
   }

   public void setPart( Part aPart ) {
      iPart = aPart;
   }


   public ArrayList<Part> getParttList() {
      return iParttList;
   }


   public void setParttList( ArrayList<Part> aParttList ) {
      iParttList = aParttList;
   }

}
公共类PartGroup{
私人部分iPart;
私有ArrayList iPartList;
公共部分getPart(){
返回iPart;
}
公共部分(分开部分){
iPart=分开;
}
公共ArrayList getParttList(){
返回iPartList;
}
public void setParttList(ArrayList aParttList){
iPart列表=公寓列表;
}
}
是否可以为iPart列表和iPart设置设置器? 我认为只有在消费者可以使用getter获取集合的创建实例并清除或向集合中添加元素时,使用getter才是安全的 我应该删除setter并添加以下实现吗

public ArrayList<Part> getParttList() {
      if(iParttList == null)
         iParttList = new ArrayList<Part>();

      return iParttList;
   } 

public Part getPart() {
       if(iPart == null)
          iPart = new Part();

       return iPart;
   }
public ArrayList getParttList(){
如果(iPartList==null)
iParttList=新的ArrayList();
返回iPartList;
} 
公共部分getPart(){
如果(iPart==null)
iPart=新零件();
返回iPart;
}

最佳实践是什么?

您最初的实现似乎是getter和setter的标准实现。为什么您认为需要将其重新排列到第二个代码块?

第二个实现防止返回null,对吗?因此,如果这个对象有可能返回null(因为有什么构造函数允许它或它可能会通过),而这对您的预期用例来说是一件坏事,那么使用第二个实现

正如我们看到的,一旦创建PartGroup实例,您就没有创建列表的构造

我认为:

  • 若您有创建零件对象列表的构造,并且希望限制使用者通过setter更改或创建列表,那个么我认为最好不要使用setter

  • 但是,若并没有构造函数来创建零件对象列表,那个么setter是创建零件对象列表的唯一方法


  • 在我看来,第二个实现似乎更好。它确保列表在任何情况下都不为空。它还有助于减少检查列表是否为空的重复代码。最后,调用
    public void setParttList(ArrayList aParttList)
    可能会有风险,因为它可能会设置一个新列表,即使已经存在一个列表。

    如果有人设置一个新的ArrayList,它将替换整个列表是的,因为这是您告诉它要做的,您的预期功能是什么?我认为只有当消费者可以使用getter获取集合的创建实例并清除向集合中添加元素时,才可以使用getter。您认为如何?如果您希望他们将部件添加到部件列表中,您可以创建一个单独的方法来允许他们这样做。此外,如果您不希望他们能够设置完整的ArrayList,那么请删除setter,是的。您可以按照自己的意愿以及您认为对您的问题更有利的方式进行操作。这个问题主要是基于意见的,因此永远不会得到简明的解决方案。像你这样的问题对于Stackoverflow来说是离题的。没有通用的最佳实践。事情总是取决于需求。尽管如此,主要的最佳实践是:两种方法都不要使用。避免暴露内部状态,决不允许外部人员更新您的内部状态。