15

是否可以在 Java 中设置默认方法参数值?

示例:如果有方法

public int doSomething(int arg1, int arg2)
{
//some logic here
    return 0;
}

是否可以修改给定的方法以便能够在有参数和没有参数的情况下调用它?

例子:

doSomething(param1, param2);
doSomething();

谢谢!

4

7 回答 7

52

您可以通过方法重载来完成此操作。

public int doSomething(int arg1, int arg2)
{
        return 0;
}

public int doSomething()
{
        return doSomething(defaultValue0, defaultValue1);
}

通过创建此无参数方法,您允许用户使用您在无参数方法的实现中提供的默认参数调用有参数的方法。这称为重载方法。

于 2009-06-24T13:37:37.250 回答
17

如果您的参数是同一类型,您可以使用可变参数:

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();
}

构建器模式允许您稍后添加/删除参数,您无需为它们创建新的重载方法。

于 2009-06-24T13:40:02.703 回答
9

不,Java 不支持 C++ 等默认参数。您需要定义不同的方法:

public int doSomething()
{
   return doSomething(value1, value2);
}
于 2009-06-24T13:37:28.263 回答
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 注释中提及您使用的默认值是什么!

于 2009-06-24T13:38:56.030 回答
2

在 Java 中无法设置默认值。我首选的处理方法是重载该方法,因此您可能会遇到以下情况:

public class MyClass
{
  public int doSomething(int arg1, int arg2)
  {
    ...
  }

  public int doSomething()
  {
    return doSomething(<default value>, <default value>);
  }
}
于 2009-06-24T13:40:09.583 回答
1

希望我没有误解这个文档,但是如果您使用 Java 1.8,理论上,您可以通过在您实现的接口中定义默认方法(“防御者方法”)的工作实现来完成类似的事情。

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 );
于 2013-03-29T15:42:17.670 回答
1

您可以使用不同的参数重载该方法:

public int doSomething(int arg1, int arg2)
{
//some logic here
        return 0;
}

public int doSomething(
{
doSomething(0,0)
}
于 2009-06-24T13:39:12.363 回答