哪种方法签名好,为什么?

时间:2012-07-05 08:59:41

标签: java

给定一个IP地址范围(a.b.c.d - a.b.c.e)我想要一个方法来返回范围内数组列表中的ip地址。

选项1:

public static int getIPAddressesFromRange(String rangeStr, List list ) ;

返回值为count,输入列表将填充范围包含的IP列表

选项2:

public static List getIPAddressesFromRange(String rangeStr)

返回值是ip地址列表'

我的选项是2,但这是直觉,但不能支持我的论点。

编辑:选项1是否有违反设计原则?

11 个答案:

答案 0 :(得分:5)

我会说

public static List<String> getIPAddressesFromRange(String rangeStr)

如果您决定将IP地址表示为字符串。

反对#1的论据:

  • 来电者需要提前构建列表
  • 除非您记录
  • ,否则返回值并不简单
  • 该方法会改变其中一个参数,这通常不被禁止,但最好避免让API的用户感到惊讶(特别是如果他们不喜欢阅读文档)。
  • 意外地为list参数传递null值将导致NullPointerException。
  • 如果您真的关心它,您可以随时从列表中获取列表的长度。

答案 1 :(得分:2)

将选项2添加到选项1。

该列表无论如何都包含其计数,因此无需返回两个值(计数和列表)。

此外,由于您知道列表的类型,因此您可以使用泛型:List<String>

最后,您还可以考虑采用两个参数:范围的开头和结尾。

答案 2 :(得分:2)

为什么要在第一种方法中返回计数?您可以从List本身获取IP的数量。

第二种方法应该是首选方法

答案 3 :(得分:2)

你的第二个选择是最好的,因为第一个选项有两个问题:

  1. 这是多余的。如果返回List,您可以使用其size()方法获取该计数,这样您就可以通过返回计数获得任何收益。
  2. 必须验证列表,在某些情况下,该方法无法完成其工作。如果调用者传递null,则如果未仔细编写代码,则存在抛出NullPointerException的危险。同样在这种情况下,调用者将不会重新分配参数以指向新列表,因此您唯一的远程理智选项是抛出一个明确的异常。使用第二个选项,您可以完全控制列表,直到它返回给调用者。

答案 4 :(得分:1)

选项二可能更好,因为任何读者都清楚返回的方法是什么。
方法1可能会使未来的编码人员花时间思考这个参数是什么(除非它被正确记录),而方法2则是直接的。

如果您稍后需要迭代检索到的列表,则选项二也会使它更加整洁,不需要临时变量:

for (Object o : getIPAddressesFromRange(String rangeStr)) { ... }

您还应该更喜欢使用generic type List<>而不是原始类型。

答案 5 :(得分:1)

东西,东西,东西。这就是你的选择2所做的。

选项1改变其输入参数并返回冗余值(count,可以从列表中获取)。

另一件事是,或许一些IP地址可以通过String之外的其他类型更好地描述。

答案 6 :(得分:1)

IMO方法签名表明它会从范围返回一个ip地址列表,而不是该范围内有多少个地址,因此我也选择2。

答案 7 :(得分:1)

我认为第二个更好:

  • 计数是列表的大小
  • 您不必为功能列出
  • Less null指针异常风险

答案 8 :(得分:0)

你的直觉也是我的,最好让getIPAddressesFromRange使用其首选的List实现,并避免有人给你一个已填充的列表。

答案 9 :(得分:0)

我的观点是第二种方法签名通常是最好的,因为第一种方法签名会将您的列表对象暴露给并发修改。因此,在您的方法结束时,它可能会保留比预期更少,更多的其他对象。

答案 10 :(得分:0)

这取决于您是要填充预先创建的列表还是创建新列表。

例如:您可以使用相同的List对象对函数执行多次调用以节省一些内存。

或者:要比较多个列表,您可能希望为每个呼叫返回一个新列表。

我会选择选项2。