how to set default method argument values?
本问题已经有最佳答案,请猛点这里访问。
是否可以在Java中设置默认的方法参数值?
例子:如果有方法
1 2 3 4 5 | public int doSomething(int arg1, int arg2) { //some logic here return 0; } |
是否可以修改给定的方法,以便能够使用和不使用参数来调用它?
例子:
1 2 | doSomething(param1, param2); doSomething(); |
号
谢谢!
您可以通过方法重载来实现这一点。
1 2 3 4 5 6 7 8 9 | public int doSomething(int arg1, int arg2) { return 0; } public int doSomething() { return doSomething(defaultValue0, defaultValue1); } |
号
通过创建此无参数方法,您允许用户使用在无参数方法实现中提供的默认参数调用ParameterFull方法。这称为重载方法。
如果参数类型相同,则可以使用varargs:
1 2 3 4 5 6 7 8 9 10 11 | public int something(int... args) { int a = 0; int b = 0; if (args.length > 0) { a = args[0]; } if (args.length > 1) { b = args[1]; } return a + b } |
但是这样你就失去了各个论点的语义,或者
有一个方法重载,它将调用中继到参数化版本
1 2 3 | public int something() { return something(1, 2); } |
。
或者,如果该方法是某种初始化过程的一部分,则可以改用生成器模式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class FoodBuilder { int saltAmount; int meatAmount; FoodBuilder setSaltAmount(int saltAmount) { this.saltAmount = saltAmount; return this; } FoodBuilder setMeatAmount(int meatAmount) { this.meatAmount = meatAmount; return this; } Food build() { return new Food(saltAmount, meatAmount); } } Food f = new FoodBuilder().setSaltAmount(10).build(); Food f2 = new FoodBuilder().setSaltAmount(10).setMeatAmount(5).build(); |
。
然后处理食物对象
1 2 3 | int doSomething(Food f) { return f.getSaltAmount() + f.getMeatAmount(); } |
生成器模式允许您稍后添加/删除参数,并且不需要为它们创建新的重载方法。
不。Java不支持默认参数,如C++。您需要定义一个不同的方法:
1 2 3 4 | public int doSomething() { return doSomething(value1, value2); } |
您不能为参数声明默认值,比如c(我相信)允许您这样做,但是您可以简单地创建一个重载。
1 2 3 4 5 6 7 8 9 | public int doSomething(int arg1, int arg2) { //some logic here return 0; } //overload supplies default values of 1 and 2 public int doSomething() { return doSomething(1, 2); } |
如果您要做这样的事情,请帮助其他使用代码的人,并确保在javadoc注释中提到您使用的默认值是什么!
在Java中默认值是不可能的。我处理这一问题的首选方法是重载该方法,这样您可能会遇到如下情况:
1 2 3 4 5 6 7 8 9 10 11 12 | public class MyClass { public int doSomething(int arg1, int arg2) { ... } public int doSomething() { return doSomething(<default value>, <default value>); } } |
。
希望我不会误解这个文档,但是如果你使用Java 1.8,在理论上,你可以通过在你实现的接口中定义一个默认方法("防御者方法")的工作实现来完成这样的事情。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | interface DoInterface { void doNothing(); public default void remove() { throw new UnsupportedOperationException("remove"); } public default int doSomething( int arg1, int arg2) { val = arg1 + arg2 * arg1; log("Value is:" + val ); return val; } } class DoIt extends DoInterface { DoIt() { log("Called DoIt constructor."); } public int doSomething() { int val = doSomething( 0, 100 ); return val; } } |
然后,不管怎样称呼它:
1 2 3 | DoIt d = new DoIt(); d.doSomething(); d.soSomething( 5, 45 ); |
。
可以使用不同的参数重载方法:
1 2 3 4 5 6 7 8 9 10 | public int doSomething(int arg1, int arg2) { //some logic here return 0; } public int doSomething( { doSomething(0,0) } |
。