2009-10-23 20 views
1

我想知道您的意见,您发现是一种更好的方法,可以使用不同的方法填充列表。我知道没有明确的答案,但我希望看到合理的利弊。填写Java列表的方法

接近1

private List<Snap> snapList; 
snapList = getSnapList(); 

方法2.

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

感谢, 马加什

+0

这应该是社区wiki。 – IAdapter

回答

3

我比方法2更喜欢方法1,因为列表实际上是您调用的方法的输出。方法1使得比方法2更清楚。

此外,方法1给予该方法返回不可修改列表的机会。如果列表应该填充一次,并且以后不应该修改,则可能需要这样做。 Java不是一种函数式编程语言,但第一种方法更多的是函数式编程风格而不是第二种方法(在函数式编程中,不变性和避免可变状态是重要的想法 - 这些中的一个重要优点是它们使并发编程更容易,这在非函数式编程语言中也很有用)。

+0

嘿,非常好的论点......和爱的功能观点:) – helios

6

为什么不按照Java API的Collections类,使你的填充方法是静态的(如果它是有意义的并且独立于对象状态)。

Collections.fill(mylist, 0); 

MyListFiller.fill(myList, args); 

在任何情况下,创造一个填料接口有道理的,如果补法计划改变。如果你不是真的“填充”,但返回某种类型的对象状态,只需让给定的方法构建List并返回它。对于第一种选择

public List<Object> getMyStuff() 
{ 
//build and return my stuff 
} 
+0

我喜欢静态方法的想法。然而,我被卡住了,因为我想有一个可以利用依赖注入的fill方法的接口。但是我不能在接口中定义静态方法。你有什么建议? – Matyas

+0

使用填充方法制作填充界面。它与单个静态类的工作方式大致相同。填充填充而不是MyFiller.fill。 –

1

一个con是,你已经选择方法名(getSnapList())通常被认为是一个简单的访问,即对现场snapList返回参考。在你的设计中,暗示你将创建列表,如果它不存在并填充数据,这会给正常的习惯用法带来副作用。

由于这个原因,最好是明确的,我更喜欢第二个选项。

3

这取决于情况。

getSnapList()的方法是在像下列情况下适当:

  1. 你写不希望关心列表来自哪里的方法。
  2. 的方法不应该知道什么样的名单,它变得 - 例如,如果你想改变使用LinkedList,那么你就可以做到这一点在getSnapList(),而不是所有的调用fillSnapList()方法。
  3. 你只会想要填写新列表。

fillSnapList()的方法是在像下列情况下适当:

  1. 您可能需要填充列表超过一次。
  2. 您可能想要改变列表的填充方式(即放入的内容)。
  3. 你需要填写别人交给你的清单。
  4. 您需要在多个类或对象之间共享该列表,并且您可能需要在其使用寿命的某个点重新填充它。
0

我更喜欢方法#1,因为方法可以被希望使用不同List实现的子类覆盖。另外,我认为将工厂方法命名为getter会令人困惑,我宁愿将其命名为newSnapList()或createSnapList()。