是否可以在Java中设置默认方法参数值?
实施例: 如果有方法
public int doSomething(int arg1, int arg2)
{
//some logic here
return 0;
}
是否可以修改给定的方法,以便能够使用和不使用参数调用它?
示例:
doSomething(param1, param2);
doSomething();
谢谢!
答案 0 :(得分:48)
您可以通过方法重载来完成此操作。
public int doSomething(int arg1, int arg2)
{
return 0;
}
public int doSomething()
{
return doSomething(defaultValue0, defaultValue1);
}
通过创建此无参数方法,您允许用户使用您在无参数方法的实现中提供的默认参数调用parameterfull方法。这称为重载方法。
答案 1 :(得分:15)
如果您的参数类型相同,则可以使用varargs:
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
}
但是这样你就失去了各个参数的语义,或者
有一个方法重载,它将调用转发到参数化版本
public int something() {
return something(1, 2);
}
或者如果该方法是某种初始化过程的一部分,则可以改为使用构建器模式:
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();
然后使用Food对象
int doSomething(Food f) {
return f.getSaltAmount() + f.getMeatAmount();
}
构建器模式允许您稍后添加/删除参数,而不需要为它们创建新的重载方法。
答案 2 :(得分:8)
没有。 Java不支持C ++等默认参数。您需要定义不同的方法:
public int doSomething()
{
return doSomething(value1, value2);
}
答案 3 :(得分:3)
您不能为C#(我相信)允许的参数声明默认值,但您可以简单地创建一个重载。
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评论中提及您使用的默认值是什么!
答案 4 :(得分:2)
在Java中默认值是不可能的。处理此问题的首选方法是重载方法,以便您可以使用以下内容:
public class MyClass
{
public int doSomething(int arg1, int arg2)
{
...
}
public int doSomething()
{
return doSomething(<default value>, <default value>);
}
}
答案 5 :(得分:1)
您可以使用不同的参数重载方法:
public int doSomething(int arg1, int arg2)
{
//some logic here
return 0;
}
public int doSomething(
{
doSomething(0,0)
}
答案 6 :(得分:1)
希望我不会误解this document,但是如果您使用Java 1.8,理论上,您可以通过在界面中定义默认方法(“defender方法”)的工作实现来完成类似的操作实施
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;
}
}
然后,以任何一种方式调用它:
DoIt d = new DoIt();
d.doSomething();
d.soSomething( 5, 45 );