Поддерживает ли Java значения по умолчанию для параметров?
Проблема с использованием параметров по умолчанию в 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 ответ(ов)
К сожалению, нет.
К сожалению, да.
Функция с параметрами по умолчанию:
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++ выполняет проверку типов на этапе компиляции.
Вы можете сделать это на Scala, которая работает на JVM и совместима с программами на Java. Вот пример определения класса:
class Foo(var prime: Boolean = false, val rib: String) {}
В этом примере prime
— это изменяемый параметр, который по умолчанию имеет значение false
, а rib
— это фиксированный (неизменяемый) параметр типа String
. Для получения дополнительной информации о языке Scala вы можете посетить официальный сайт Scala.
Вместо использования следующего кода:
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
и так далее.
Установка значения по умолчанию для параметра функции в JavaScript
Что такое параметры -Xms и -Xmx при запуске JVM?
Что значит "Не удалось найти или загрузить основной класс"?
Почему в RecyclerView отсутствует onItemClickListener()?
Что значит 'synchronized'?