如何设置默认方法参数值? [复制]

Posted

技术标签:

【中文标题】如何设置默认方法参数值? [复制]【英文标题】:how to set default method argument values? [duplicate] 【发布时间】:2010-11-05 12:29:21 【问题描述】:

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

示例: 如果有方法

public int doSomething(int arg1, int arg2)

//some logic here
    return 0;

是否可以修改给定的方法以便能够使用和不使用参数来调用它?

示例:

doSomething(param1, param2);
doSomething();

谢谢!

【问题讨论】:

和这个基本一样:'Does Java support default parameter values?',***.com/questions/997482/… 【参考方案1】:

没有。 Java 不支持 C++ 等默认参数。你需要定义一个不同的方法:

public int doSomething()

   return doSomething(value1, value2);

【讨论】:

【参考方案2】:

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

public int doSomething(int arg1, int arg2)

        return 0;


public int doSomething()

        return doSomething(defaultValue0, defaultValue1);

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

【讨论】:

【参考方案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 cmets 中提及您使用的默认值是什么!

【讨论】:

C# 不允许您使用可选或默认参数。这样做的语言例如 C++ 和 python。【参考方案4】:

你可以用不同的参数重载方法:

public int doSomething(int arg1, int arg2)

//some logic here
        return 0;


public int doSomething(

doSomething(0,0)

【讨论】:

【参考方案5】:

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

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 用于提及构建器模式。 +1 用于使用可变参数,我很少看到开发人员使用它。【参考方案6】:

在 Java 中无法设置默认值。我首选的处理方法是重载方法,这样你可能会有类似的东西:

public class MyClass

  public int doSomething(int arg1, int arg2)
  
    ...
  

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

【讨论】:

【参考方案7】:

希望我没有误解this document,但如果您使用 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 );

【讨论】:

以上是关于如何设置默认方法参数值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在JAVA中能给方法参数赋默认值吗

js设置函数参数默认值的3种方法

函数的默认参数值

方法参数数组默认值

Android:如何为参数变量设置默认值

如何将实例成员的默认参数值传递给方法?