【问题标题】:Have multiple optional parameters有多个可选参数
【发布时间】:2023-03-08 07:53:01
【问题描述】:

我试图在我的方法中使用可选参数。我找到了 bolean... 测试,它有效。但是每当我尝试使用第二个时,它都不起作用。

是否有可能放置两个或更多(相同类型,例如:2 个选项布尔值)

代码: 我现在拥有的:

public void addJButton(boolean... yo){}

我想要什么:

public void addJButton(boolean... yo, boolean... yo2){}

【问题讨论】:

标签: java methods parameters optional-parameters optional


【解决方案1】:

Java 不支持函数中的可选参数。

相反,为函数提供 重载,如下所示:

void myFunction(boolean parameter)
{
    /*ToDo - code here*/    
}

void myFunction()
{
    myFunction(true/*i.e. call the overload with a default to true*/);
}

当然,这种方式可以默认多个参数,并且可以有多个重载来支持不同的默认方案。

【讨论】:

  • var-args 通常被认为是可选参数,因此 Java 确实支持它们。但它们仅限于每个方法一个 var-arg 参数,并且它们必须是最后一个参数。
【解决方案2】:

至于 varargs-notation (boolean...):varargs-parameter 总是必须是最后一个,所以你只能有其中一个。

您可以考虑为省略的参数传递null,或者您可以尝试像 Bathseba 建议的某种方法重载。

在进行重载时,您必须记住没有命名参数,因此只有 poosition 和 type 可以定义传递哪个参数,省略哪个参数!

【讨论】:

    【解决方案3】:

    在处理多个或可选参数时尝试构建器模式

    // Builder Pattern
    public class NutritionFacts {
        private final int servingSize;
        private final int servings;
        private final int calories;
        private final int fat;
        private final int sodium;
        private final int carbohydrate;
    
        public static class Builder {
            // Required parameters
            private final int servingSize;
            private final int servings;
    
            // Optional parameters - initialized to default values
            private int calories      = 0;
            private int fat           = 0;
            private int carbohydrate  = 0;
            private int sodium        = 0;
    
            public Builder(int servingSize, int servings) {
                this.servingSize = servingSize;
                this.servings    = servings;
            }
    
            public Builder calories(int val)
                { calories = val;      return this; }
            public Builder fat(int val)
                { fat = val;           return this; }
            public Builder carbohydrate(int val)
                { carbohydrate = val;  return this; }
            public Builder sodium(int val)
                { sodium = val;        return this; }
    
            public NutritionFacts build() {
                return new NutritionFacts(this);
            }
        }
    
        private NutritionFacts(Builder builder) {
            servingSize  = builder.servingSize;
            servings     = builder.servings;
            calories     = builder.calories;
            fat          = builder.fat;
            sodium       = builder.sodium;
            carbohydrate = builder.carbohydrate;
        }
    }
    

    添加值:

    NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).
      calories(100).sodium(35).carbohydrate(27).build();
    

    【讨论】:

      【解决方案4】:

      Java 确实支持 var-args 形式的可选参数,但每个方法只能有 1 个 var-arg 参数,并且必须是参数列表中的最后一个(Varargs)。

      Java 支持重载方法,Java 可以区分具有不同方法签名的方法。这意味着如果类中的方法具有不同的参数列表,则它们可以具有相同的名称:

      public class DataArtist {
          ...
          public void draw(boolean b1) {
              ...
          }
          public void draw(boolean b1, boolean b2) {
              ...
          }
          public void draw(double f) {
              ...
          }
          public void draw(int i, double f) {
              ...
          }
      }
      

      更多信息:Java Methods

      【讨论】:

      • 这个需要改写Java确实支持var-args形式的可选参数,但是每个方法只能有1个var-arg参数并且必须是参数列表中的最后一个。
      【解决方案5】:

      这是一个迟到的答案,但 Java 有 var-args 而不是可选参数,正如其他人所说,每个方法只能使用一个,并且 var-arg 参数必须是方法中的最后一个。

      如果你需要之类的这个;

      public void addJButton(boolean... yo, boolean... yo2){}
      

      那么以下替代方案可用。

      public void addJButton(boolean yo1, boolean yo2, boolean... yo3){}
      public void addJButton(boolean[] yo1, boolean[] yo2){}
      

      第一个选项表示在重载方法中手动指定布尔值的数量,第二个选项采用两个布尔值数组。一旦进入方法,您的 var-args 最终将被解释为数组。

      【讨论】:

        【解决方案6】:

        如果你想有多个可选参数

        public void initDatePickers(final EditText et,boolean... disableFuturedates)
        {...}
        

        然后您可以像这样以数组的形式访问这些值,

        if(disableFuturedates[0])
        {
        
        }
        

        【讨论】:

          猜你喜欢
          • 2019-03-11
          • 2016-03-25
          • 2017-09-02
          • 2014-11-10
          • 2016-11-15
          • 1970-01-01
          • 1970-01-01
          • 2015-02-25
          • 1970-01-01
          相关资源
          最近更新 更多