使用 Java varargs 作为可选参数是否被认为是一个很好的编程习惯?
甚至更多:如果我有一个接口,并且某些实现需要附加参数,而有些则不需要,是否可以在方法签名中为可选参数使用可变参数?
在 Java 中,可以使用以下成语:
public static void x(String ... strings)
它得到一个字符串数组,可能是空的。你可以用
x() (empty array), x("1","2","3") etc
使用 Java varargs 作为可选参数是否被认为是一个很好的编程习惯?
甚至更多:如果我有一个接口,并且某些实现需要附加参数,而有些则不需要,是否可以在方法签名中为可选参数使用可变参数?
在 Java 中,可以使用以下成语:
public static void x(String ... strings)
它得到一个字符串数组,可能是空的。你可以用
x() (empty array), x("1","2","3") etc
当您不知道 api 的用户希望传递的“特定类型”的参数数量时,通常使用可变参数。我认为这没有任何问题,因为用户可以决定传递任意数量的参数或根本不传递任何参数。例如
public class NewClass {
public void print(String... a) {
System.out.println(a);
}
public static void main(String[] args) {
new NewClass().print();
}
}
不要伤害。因为您知道可变参数中的类型。
我会说不。使用可变参数将允许为您的可选参数提供任意数量的参数。你将如何与实现你的接口或调用你的方法的人沟通只需要一个值?当提供多个值时,行为应该是什么?这些都是不必要的并发症。
如果您的方法需要 0 或 1 个值作为可选参数,那么您应该使用只允许提供 0 或 1 个值的语言结构。重载方法签名或允许可选参数为空会更合适。
我认为使用可变参数来实现可选参数不是一个好主意。
Animal a = new Dog();
a.speak("bow");
您不知道查看上面示例中的参考资料应该应用哪些参数,因为如果从动物列表中提取动物,您可能不知道它是一只狗。
正如@Oli 所说,显式重载是一种很好的方法。