【问题标题】: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();

谢谢!

【问题讨论】:

标签: java parameters methods default-value


【解决方案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 );
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-11-02
            • 2020-01-27
            • 2019-05-23
            • 2011-10-06
            • 1970-01-01
            • 2018-07-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多