21

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

9

Проблема с использованием параметров по умолчанию в Java

Я столкнулся с некоторым кодом на Java, который имеет следующую структуру:

public MyParameterizedFunction(String param1, int param2)
{
    this(param1, param2, false);
}

public MyParameterizedFunction(String param1, int param2, boolean param3)
{
    // Используем все три параметра здесь
}

Я знаю, что в C++ я могу присваивать параметрам значения по умолчанию. Например:

void MyParameterizedFunction(String param1, int param2, bool param3=false);

Поддерживает ли Java подобный синтаксис? И есть ли причины, по которым такой двухступенчатый синтаксис является предпочтительным?

4 ответ(ов)

3

К сожалению, нет.

0

К сожалению, да.

Функция с параметрами по умолчанию:

void MyParameterizedFunction(String param1, int param2, bool param3=false) {}

может быть реализована в Java 1.5 следующим образом:

void MyParameterizedFunction(String param1, int param2, Boolean... params) {
    assert params.length <= 1;
    boolean param3 = params.length > 0 ? params[0].booleanValue() : false;
}

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

new Boolean[]{}

при каждом вызове функции.

Что касается нескольких параметров по умолчанию:

void MyParameterizedFunction(String param1, int param2, bool param3=false, int param4=42) {}

то это можно записать в Java 1.5 так:

void MyParameterizedFunction(String param1, int param2, Object... p) {
    int l = p.length;
    assert l <= 2;
    assert l < 1 || Boolean.class.isInstance(p[0]);
    assert l < 2 || Integer.class.isInstance(p[1]);
    boolean param3 = l > 0 && p[0] != null ? ((Boolean)p[0]).booleanValue() : false;
    int param4 = l > 1 && p[1] != null ? ((Integer)p[1]).intValue() : 42;
}

Это соответствует синтаксису C++, который позволяет задавать параметры по умолчанию только в конце списка параметров.

Помимо синтаксиса, существует различие: в этом случае происходит проверка типов в процессе выполнения для передаваемых параметров с параметрами по умолчанию, в то время как C++ выполняет проверку типов на этапе компиляции.

0

Вы можете сделать это на Scala, которая работает на JVM и совместима с программами на Java. Вот пример определения класса:

class Foo(var prime: Boolean = false, val rib: String) {}

В этом примере prime — это изменяемый параметр, который по умолчанию имеет значение false, а rib — это фиксированный (неизменяемый) параметр типа String. Для получения дополнительной информации о языке Scala вы можете посетить официальный сайт Scala.

0

Вместо использования следующего кода:

void parameterizedMethod(String param1, int param2) {
    this(param1, param2, false);
}

void parameterizedMethod(String param1, int param2, boolean param3) {
    // используйте все три параметра здесь
}

Вы можете воспользоваться функциональностью Optional, предоставляемой Java, и реализовать метод с одним параметром:

void parameterizedMethod(String param1, int param2, @Nullable Boolean param3) {
    param3 = Optional.ofNullable(param3).orElse(false);
    // используйте все три параметра здесь
}

Основное отличие заключается в том, что вам придется использовать классы-обертки вместо примитивных типов Java, чтобы разрешить null в качестве входного значения. То есть используйте Boolean вместо boolean, Integer вместо int и так далее.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь