如何设置默认的方法参数值?

16

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

例如: 如果有一个方法:

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

有没有可能修改给定的方法,使其能够在有参数和无参数的情况下都可以调用?

例如:

doSomething(param1, param2);
doSomething();

谢谢!


4
Java 是否支持默认参数值?和这个问题基本相同:'Does Java support default parameter values?', https://dev59.com/jHNA5IYBdhLWcg3wWsYA。 - Jonik
7个回答

55

你可以通过方法重载实现这一点。

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

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

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


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

建造者模式允许你稍后添加或移除参数,而无需为它们创建新的重载方法。


+1 如果提到了建造者模式。 - Jason Day
使用可变参数列表的情况很少见,我很少看到开发人员使用它。 - ajduke

9

不,Java不支持像C++那样的默认参数。您需要定义一个不同的方法:

public int doSomething()
{
   return doSomething(value1, value2);
}

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注释中提到您使用的默认值!


C# 不允许使用可选或默认参数。而支持这种特性的语言有 C++ 和 Python 等。 - kgiannakakis

2

Java 中无法设置默认值。我处理这个问题的做法是通过 重载 方法,例如:

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

  public int doSomething()
  {
    return doSomething(<default value>, <default value>);
  }
}

1

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

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

public int doSomething(
{
doSomething(0,0)
}

1

希望我没有误解这份文档,但是如果你正在使用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 );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接