假设我有一个用某种对象填充列表的方法。以下方法设计的优点和缺点是什么?
void populate (ArrayList<String> list, other parameters ...)
ArrayList<String> populate(other parameters ...)
我更喜欢哪一个?
这看起来像关于方法设计的一般问题,但我在google上找不到令人满意的答案,可能是因为没有使用正确的关键字。
答案 0 :(得分:3)
第二个对我来说似乎更具功能性和线程安全性。在大多数情况下我更喜欢它。 (像所有规则一样,也有例外。)
populate方法的所有者可以返回一个不可变的List(为什么是ArrayList?)。
如果在populate方法中没有修改状态,那么它也是线程安全的。仅使用传入的参数,这些参数也可以是不可变的。
答案 1 :(得分:2)
除了@duffymo提到的,第二个更容易理解,因此使用:它的输入和输出是显而易见的。
答案 2 :(得分:1)
输入输出参数的优点:
缺点:
可读性问题。
封装问题:
线程安全问题。
侧点:能够指定列表的类型通常会导致列表类型的依赖。注意你是如何在任何地方传递ArrayLists的。当你不需要时,你可以通过说“这是一个ArrayList”来绘制自己的角色,但当你将它传递给十几种方法时,你必须改变十几种方法。 (不完全相关,但只是略微相切。您可以将类型更改为List而不是ArrayList并摆脱这一点。但是,您传递的列表越多,您需要更改的位置就越多。)
简短版本:除非您有充分的理由,否则只有在您使用方法中列表的现有内容时才使用第一种语法。 IE:如果你正在修改它,或者用现有的值做某事。如果您打算返回条目列表,则返回条目列表。
答案 3 :(得分:0)
出于多种原因,第二种方法是首选方法。 主要是因为函数签名更清晰,并显示了它的意图。
实际上建议您不要更改传递给函数的参数值,除非您明确将其标记为“out”参数。
在表达式
中也更容易使用将来更容易改变。如果你想
,包括将其用于更具功能性的方法(用于线程等)