Java-конструктор/метод с дополнительными параметрами?

Возможный дубликат:
Дополнительные параметры Java

Я знаю, что в PHP, если вы хотите вызвать функцию с меньшими параметрами, вы объявляете такую ​​функцию, как:

function foo(int param1, int param2 = "2");

и теперь я могу вызвать foo(2), а param2 будет установлено в 2.

Я попытался сделать это в конструкторе Java, но, похоже, это невозможно. Есть ли способ сделать это, или мне просто нужно объявить два конструктора?

Спасибо!

Ответ 1

В Java нет понятия необязательных параметров со значениями по умолчанию либо в конструкторах, либо в методах. Вы в основном застряли в перегрузке. Однако вы легко строите конструкторы, поэтому вам не нужно повторять код:

public Foo(int param1, int param2)
{
    this.param1 = param1;
    this.param2 = param2;
}

public Foo(int param1)
{
    this(param1, 2);
}

Ответ 2

Java не поддерживает параметры по умолчанию. Вам нужно будет иметь два конструктора, чтобы делать то, что вы хотите.

Альтернативой, если имеется множество возможных значений с настройками по умолчанию, является использование шаблона Builder, посредством которого вы используете вспомогательный объект с сеттерами.

например.

   public class Foo {
     private final String param1;
     private final String param2;

     private Foo(Builder builder) {
       this.param1 = builder.param1;
       this.param2 = builder.param2;
     }
     public static class Builder {
       private String param1 = "defaultForParam1";
       private String param2 = "defaultForParam2";

       public Builder param1(String param1) {
         this.param1 = param1;
         return this;
       }
       public Builder param2(String param1) {
         this.param2 = param2;
         return this;
       }
       public Foo build() {
         return new Foo(this);
       }
     }
   }

который позволяет вам сказать:

Foo myFoo = new Foo.Builder().param1("myvalue").build();

который будет иметь значение по умолчанию для param2.

Ответ 3

Вы можете имитировать его с помощью varargs, однако тогда вы должны проверить его на слишком много аргументов.

public void foo(int param1, int ... param2)
{
   int param2_
   if(param2.length == 0)
      param2_ = 2
   else if(para2.length == 1)
      param2_ = param2[0]
   else
      throw new TooManyArgumentsException(); // user provided too many arguments,

   // rest of the code
}

Однако этот подход не является хорошим способом сделать это, поэтому лучше использовать перегрузку.

Ответ 4

Вы можете использовать varargs для дополнительных параметров:

public class Booyah {
    public static void main(String[] args) {
        woohoo(1);
        woohoo(2, 3);
    }
    static void woohoo(int required, Integer... optional) {
        Integer lala;
        if (optional.length == 1) {
            lala = optional[0];
        } else {
            lala = 2;
        }
        System.out.println(required + lala);
    }
}

Также важно отметить использование Integer над int. Integer является оболочкой вокруг примитива int, что позволяет при необходимости делать сравнения с null.

Ответ 5

Зачем вы хотите это сделать?

Однако вы можете сделать это:

public void foo(int param1)
{
    int param2 = 2;
    // rest of code
}

или

public void foo(int param1, int param2)
{
    // rest of code
}

public void foo(int param1)
{
    foo(param1, 2);
}

Ответ 6

У вас не может быть необязательных аргументов, которые по умолчанию используют определенное значение в Java. Самое близкое к тому, что вы говорите, это java varargs, посредством чего вы можете передать произвольное количество аргументов (одного типа) методу.