编写修改对象的Java函数的最佳方法

时间:2015-05-11 13:40:25

标签: java

我目前正在从C ++转向Java工作,并且在没有const和指针的情况下遇到困难,以确保意图始终清晰。我遇到的最大问题之一是返回相同类型的修改对象。

以过滤功能为例。它用于过滤掉值。

public List<int> filter(List<Integer> values) {
    ...
}

这里的一切都是Serializable,所以我们可以先复制整个列表,然后修改内容并返回。虽然看起来有点无效但效率低下。特别是如果该列表很大。每次复制输入看起来都很笨拙。

我们可以正常传递它,修改它并清楚地表明我们是从名称中做到的:

public void modifyInputListWithFilter(List<Integer> values) {
    ...
}

这是我能想到的最干净的方法 - 如果需要,你可以事先复制它,否则只是传入它。但是我仍然宁愿不修改输入参数。

我们可以使List成为我们所在类的成员变量,并将filter方法添加到当前类中。很可能现在我们的班级做了不止一件事。

我们可以考虑将List移动​​到它自己的类,过滤器是它的函数。虽然对于一个变量来说似乎有些过分,但我们很快会有更多的课程而不是我们可以追踪的。此外,如果我们只使用这种策略,而不仅仅是过滤发生在List类中,将不可避免地开始做多件事。

那么写这篇文章的最佳方式是什么?为什么?

1 个答案:

答案 0 :(得分:1)

简短的回答是,没有一种最好的方法。不同的场景将需要不同的方法。不同的设计模式将需要不同的方法。

您已经提出了两种方法,根据具体情况,其中一种方法可能有效。

我会说修改传递给函数的List没有任何内在错误:例如,查看Collections.sort()函数。返回List的副本也没有错。

唯一的规则&#34;这是Liskov规则(不是 Liskov规则):您的函数应该执行其文档所说的任何操作。如果您要修改列表,请确保您的文档是这样说的。如果你不是,请确保代之以。