这是关于编程最佳实践的问题,我不知道如何在标题中表达问题,对不起,我们走了。
我在Manager或Controller中有这样一种方法:
public boolean myMethod(Param1 param1);
而且,因为应用程序的更改,我必须像这样重新定义它,因为它调用其他需要param2和param3的方法:
public boolean myMethod(Param1 param1, Param2 param2, Param3 param3);
现在我意识到,使用param2=null
和{将调用带有3个参数的方法“总是”(现在,可能在将来有一个更改,我需要用非空参数调用它) {1}},所以在第一种方法的实施中我做了:
param3=null
因此,调用Manager的方法和原始方式是:
public boolean myMethod(Param1 param1) {
return this.myMethod(param1, null, null);
}
public boolean myMethod(Param1 param1, Param2 param2, Param3 param3) {
/* Call to other methods that is needed to pass it param2 and param3 */
}
这是一个选项,另一个选项是从调用中传递null参数:
boolean isTrue = myManager.myMethod(param1);
在我的经理中只允许使用一种方法:
boolean isTrue = myManager.myMethod(param1, null, null);
所以,真正的问题是:谈论最佳实践的最佳方法是什么?如果在管理器的实现中我重载一个方法并使用null params调用它是错误的吗?
提前致谢!
问候。
答案 0 :(得分:4)
带有更少参数的重载方法只是用更多参数调用另一个方法,这是Java中的常见做法,并且是实现"默认"的Java方法。参数。
请注意,默认值不必是null
,它可以是任何值。
通常在调用具有多个参数的方法时,传入的值将提供参数性质的线索。像null
,false
,true
或0
这样的参数常量并没有给出参数含义的线索,这使得代码的可读性降低。
通常使用较少参数的呼叫更明显,因此使用"默认"参数优于只有一个具有大量常数参数的方法。
答案 1 :(得分:2)
当我们谈论主题时:
Java 8引入了一项新功能,专门用于支持Interface
:默认方法的多个版本。因此,假设您的Manager
班级正在实施MyInterface
。所以接口的第一个版本是
public Interface MyInterface {
public boolean myMethod(Param1 param1);
}
然后,根据不断变化的技术世界,需求发生变化。所以你需要myMethod()
的新签名。使用默认方法功能,您可以将向后兼容性的责任删除到接口:
public interface MyInterface {
// v1 with default implementation
default boolean myMethod(Param1 param1) {
return myMethod(param1, null, null);
}
// new v2 - pure virtual
public boolean myMethod(Param1 param1, Param2 param2, Param3 param3);
}
中详细了解界面默认方法
答案 2 :(得分:1)
这个问题取决于您调用的代码是否希望某些参数为null
。鉴于this问题的受欢迎程度,我建议您尽量避免发送null
值。
在这种情况下,由于您是方法的所有者,您将空值传递给我,我建议您有2个版本的方法,一个可以使用1个参数,另一个可以使用3个参数。< / p>
通常不建议更改现有方法,因为它可能会破坏现有代码。另一方面,添加新功能应该保持以前的工作原封不动。它还允许您构建相对针对性的测试用例,因为您将测试新行为而不是整个先前的行为和新行为。
答案 3 :(得分:1)
我建议您定义您提到的两种方法,而不是仅提供3参数方法,并强制该方法的所有用户提供“null”作为值。提供精简的1参数方法可明确表示其他两个参数是可选的。
在this问题的正确答案中也建议这样做。
答案 4 :(得分:1)
这本身并不是好事,也不是坏事。如前所述,这是在Java中引入默认参数的方法。
只有一个参数和幕后的重载调用另一个重载(默认情况下传递其他参数)的唯一潜在问题是,从方法的文档中不清楚这一点。
public boolean myMethod(Param1 param1) {
return this.myMethod(param1, null, null);
}
public boolean myMethod(Param1 param1, Param2 param2, Param3 param3) {
/* Call to other methods that is needed to pass it param2 and param3 */
}
在这种情况下,您应该正确记录您的第一种方法,以确保您的用户了解调用它的含义。如果你有一个重载需要明确设置为null
的参数,你就没有这个“隐藏”的问题 - 但是你仍然应该记录你的方法。
我认为这取决于你。无论您选择什么,请务必记录您的API。
顺便说一下,如果参数列表增长并且您被迫拥有大量重载,您可能需要考虑将对象作为参数传递或使用其他一些模式。