Подтвердить что ты не робот

Как установить значения аргумента метода по умолчанию?

Можно ли установить значения параметра метода по умолчанию в Java?

Пример: Если существует метод

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

Можно ли изменить данный метод, чтобы иметь возможность называть его с параметрами и без них?

Пример:

doSomething(param1, param2);
doSomething();

Спасибо!

4b9b3361

Ответ 1

Вы можете выполнить это путем перегрузки метода.

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

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

Создав этот метод без параметров, вы разрешаете пользователю вызывать метод parameterfull с аргументами по умолчанию, которые вы предоставляете в рамках реализации метода без параметров. Это называется перегрузкой метода.

Ответ 2

Если ваши аргументы одного типа, вы можете использовать varargs:

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

Рисунок построителя позволяет вам добавлять/удалять параметры позже, и вам не нужно создавать для них новые перегруженные методы.

Ответ 3

Нет. Java не поддерживает параметры по умолчанию, такие как С++. Вам нужно определить другой метод:

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

Ответ 4

Вы не можете объявлять значения по умолчанию для таких параметров, как С# (я считаю), но вы можете просто создать перегрузку.

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, какие значения по умолчанию вы используете!

Ответ 5

Невозможно установить значения по умолчанию в Java. Мой предпочтительный способ справиться с этим - перегрузить метод, чтобы у вас было что-то вроде:

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

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

Ответ 6

Вы можете перегрузить метод различными параметрами:

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

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

Ответ 7

Надеюсь, я не недопонимаю этот документ, но если вы используете 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 );