使用null参数调用重载方法是一种好习惯吗?

时间:2015-09-24 07:00:46

标签: java model-view-controller

这是关于编程最佳实践的问题,我不知道如何在标题中表达问题,对不起,我们走了。

我在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调用它是错误的吗?

提前致谢!

问候。

5 个答案:

答案 0 :(得分:4)

带有更少参数的重载方法只是用更多参数调用另一个方法,这是Java中的常见做法,并且是实现"默认"的Java方法。参数。

请注意,默认值不必是null,它可以是任何值。

通常在调用具有多个参数的方法时,传入的值将提供参数性质的线索。像nullfalsetrue0这样的参数常量并没有给出参数含义的线索,这使得代码的可读性降低。

通常使用较少参数的呼叫更明显,因此使用"默认"参数优于只有一个具有大量常数参数的方法。

答案 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);
}

您可以在Oracle tutorial on the subject

中详细了解界面默认方法

答案 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。

顺便说一下,如果参数列表增长并且您被迫拥有大量重载,您可能需要考虑将对象作为参数传递或使用其他一些模式。