用Java填写列表的方法

用Java填写列表的方法,java,collections,Java,Collections,我想知道你的意见,你认为用另一种方法填写清单是更好的方法。我知道没有确切的答案,但我希望看到合理的利弊 方法1 private List<Snap> snapList; snapList = getSnapList(); 私有列表快照列表; snapList=getSnapList(); 方法2 private List<Snap> snapList = new ArrayList<Snap>(); fillSnapList(snapList); pri

我想知道你的意见,你认为用另一种方法填写清单是更好的方法。我知道没有确切的答案,但我希望看到合理的利弊

方法1

private List<Snap> snapList;
snapList = getSnapList();
私有列表快照列表;
snapList=getSnapList();
方法2

private List<Snap> snapList = new ArrayList<Snap>();
fillSnapList(snapList);
private List snapList=new ArrayList();
fillSnapList(snapList);
谢谢,
Matyas

为什么不遵循JavaAPI的类并使fill方法成为静态的(如果它有意义并且独立于对象状态的话)

无论如何,如果fill方法计划更改,那么创建filler接口是有意义的。如果您不是真正的“填充”,而是返回某种类型的对象状态,只需让给定的方法构建列表并返回它即可

public List<Object> getMyStuff()
{
//build and return my stuff
}
public List getMyStuff()
{
//建造并归还我的东西
}

为什么不遵循Java API的类并使fill方法成为静态的(如果它有意义并且独立于对象状态的话)

无论如何,如果fill方法计划更改,那么创建filler接口是有意义的。如果您不是真正的“填充”,而是返回某种类型的对象状态,只需让给定的方法构建列表并返回它即可

public List<Object> getMyStuff()
{
//build and return my stuff
}
public List getMyStuff()
{
//建造并归还我的东西
}

第一个选项的一个缺点是,您选择的方法名(
getSnapList()
)通常被认为是一个简单的访问器,即返回字段
snapList
的引用。在您的设计中,这意味着您将创建一个不存在的列表,并用数据填充它,这将给正常习惯用法带来副作用


因此,最好是明确的,我更喜欢第二个选项。

第一个选项的一个缺点是,您选择的方法名(
getSnapList()
)通常被认为是一个简单的访问器,即返回字段
snapList
的引用。在您的设计中,这意味着您将创建一个不存在的列表,并用数据填充它,这将给正常习惯用法带来副作用


由于这一点,而且最好是明确的,我更喜欢第二个选项。

我更喜欢方法1而不是方法2,因为列表实际上是您正在调用的方法的输出。方法1比方法2更清楚地说明了这一点

private List<Snap> snapList = new ArrayList<Snap>();
fillSnapList(snapList);
此外,方法1为该方法提供了返回不可修改列表的机会。如果列表应该填写一次,以后不应该修改,那么您可能需要这样做


Java不是函数式编程语言,但第一种方法比第二种方法更具有函数式编程风格(在函数式编程中,不变性和避免可变状态是重要的思想,它们的一个重要优点是使并发编程更容易,这在非函数式编程语言中也很有用)与方法2相比,我更喜欢方法1,因为列表实际上是您正在调用的方法的输出。方法1比方法2更清楚

private List<Snap> snapList = new ArrayList<Snap>();
fillSnapList(snapList);
此外,方法1使该方法有机会返回一个不可修改的列表。如果该列表只需填写一次,以后不应修改,则可能需要这样做


Java不是函数式编程语言,但第一种方法比第二种方法更具有函数式编程风格(在函数式编程中,不变性和避免可变状态是重要的思想,它们的一个重要优点是使并发编程更容易,这在非函数式编程语言中也很有用)。

这取决于具体情况

类似于
getSnapList()
的方法适用于以下情况:

  • 您正在编写的方法不想关心列表的来源
  • 该方法不应该知道它得到的是什么类型的列表——例如,如果您想更改为使用
    LinkedList
    ,那么您可以在
    getSnapList()
    中执行该操作,而不是调用
    fillSnapList()
    的所有方法
  • 您将只希望填写新列表
  • 类似于
    fillSnapList()
    的方法适用于以下情况:

  • 您可能需要多次填写该列表
  • 您可能希望改变列表的填充方式(即,放入内容)
  • 你需要填写别人交给你的清单
  • 您需要在多个类或对象之间共享该列表,并且可能需要在其生命周期的某个时刻重新填充该列表

  • 这要视情况而定

    类似于
    getSnapList()
    的方法适用于以下情况:

  • 您正在编写的方法不想关心列表的来源
  • 该方法不应该知道它得到的是什么类型的列表——例如,如果您想更改为使用
    LinkedList
    ,那么您可以在
    getSnapList()
    中执行该操作,而不是调用
    fillSnapList()
    的所有方法
  • 您将只希望填写新列表
  • 类似于
    fillSnapList()
    的方法适用于以下情况:

  • 您可能需要多次填写该列表
  • 您可能希望改变列表的填充方式(即,放入内容)
  • 你需要填写别人交给你的清单
  • 您需要在多个类或对象之间共享该列表,并且可能需要在其生命周期的某个时刻重新填充该列表
  • 我更喜欢方法#1,因为该方法可以由希望使用不同列表实现的子类重写。此外,我认为将工厂方法命名为getter会令人困惑,我更喜欢将其命名为newSnapList()或createSnapList()。

    我更喜欢方法#1,因为该方法可以由