Java 使用输出参数是否被视为不良做法?

Java 使用输出参数是否被视为不良做法?,java,coding-style,Java,Coding Style,每次我看到一个方法的一个参数都是一样的 void addTokenErrorsToReport(列出标记,映射报告) 我觉得这完全是错误的。在我看来,参数通常应该是不可变的,并且在一个方法中不会改变。例如,上述方法可以重写为 Map<String, Integer> createTokenErrorsReport(List<String tokens) Map createTokenErrorsReport(列表我认为这取决于你来自哪里(语言)如果你曾经使用C或C++,你可

每次我看到一个方法的一个参数都是一样的

void addTokenErrorsToReport(列出标记,映射报告)
我觉得这完全是错误的。在我看来,参数通常应该是不可变的,并且在一个方法中不会改变。例如,上述方法可以重写为

Map<String, Integer> createTokenErrorsReport(List<String tokens)

Map createTokenErrorsReport(列表我认为这取决于你来自哪里(语言)如果你曾经使用C或C++,你可以使用指针作为参数,这是很好的,实用的,你可以像第一个例子一样容易地编写代码。我不认为有什么好的或坏的,只是你的编码风格是如何。

< P>就像大多数事物一样,它只是“坏的实践”。如果它导致代码功能不良/不可读/难以维护,或者您不知道为什么要这样做

在大多数情况下,使用输出参数不会产生这些效果

在addTokenErrorsToReport中,这当然是一种合适的方法。您正在向报表中添加令牌错误-函数需要知道它正在添加的令牌以及它正在添加到的报表。函数清楚地执行它设计用于执行的操作,没有任何缺点

如果要采用createTokenErrorsReport方法,则必须在每次调用之后在现有报告中插入新标记。如果将标记添加到现有报告是一项常见操作,则使用添加的方法最有意义。这并不是说createTokenErrorsReport也不应该存在-如果从令牌列表创建新报告是一项常见操作,那么您需要一个函数来完成此操作

很好地使用输出参数的一个很好的例子是
Collections.sort
,它对列表进行适当排序。避免了创建列表的新副本并返回已排序副本的性能影响,同时也不会限制您创建副本并在需要时对副本进行排序


只需使用最好的工具来完成这项工作,并保持代码简洁。

我经常看到这种编码实践,发现它相当优雅。它允许您“返回”多个对象


例如,在上面的示例中,您可以返回一个与错误代码对应的整数值。

在第二个示例中,您将如何向映射添加内容?我认为如果您必须传递一个填充了
addTokenErrorsToReport
的空映射,这将是一种不好的做法。但是在这种情况下:不,我认为这不是一种不好的做法e、 如果要处理多个
列表令牌
,您将如何实现其他方法?我认为第一个示例很简单

Map<String, Integer> createTokenErrorsReport(List<String tokens)