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

1506
задан Wolf 8 May 2019 в 09:01
поделиться

7 ответов

Нет, структура, которую вы нашли, - это то, как Java обрабатывает ее (то есть с перегрузкой вместо параметров по умолчанию).

Для конструкторов, См. Совет пункта 1 «Эффективная Java: Руководство по языку программирования» (рассмотрите статические фабричные методы вместо конструкторов), если перегрузка усложняется. Для других методов может помочь переименование некоторых случаев или использование объекта параметра. Это когда у вас достаточно сложности, и дифференцировать сложно. Определенный случай - это когда вы должны различать, используя порядок параметров, а не только количество и тип.

893
ответ дан 22 November 2019 в 20:13
поделиться

К сожалению, №

240
ответ дан 22 November 2019 в 20:13
поделиться

Нет.

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

6
ответ дан 22 November 2019 в 20:13
поделиться

Нет, но вы можете использовать Шаблон Builder , как описано в этом ответе на переполнение стека .

Как описано в связанном ответе, Шаблон Builder позволяет писать код типа

Student s1 = new StudentBuilder().name("Eli").buildStudent();
Student s2 = new StudentBuilder()
                 .name("Spicoli")
                 .age(16)
                 .motto("Aloha, Mr Hand")
                 .buildStudent();

, в котором некоторые поля могут иметь значения по умолчанию или быть необязательными.

615
ответ дан 22 November 2019 в 20:13
поделиться

Нет. В общем, в Java не так много синтаксического сахара, поскольку они пытались сделать простой язык.

6
ответ дан 22 November 2019 в 20:13
поделиться

Есть полдюжины или лучше проблем, таких как эта, в конце концов, вы придете к статическому шаблону фабрики ... см. Криптографический API для этого . Сортировку сложно объяснить, но подумайте об этом так: если у вас есть конструктор, по умолчанию или иначе, единственный способ передать состояние за пределы фигурных скобок - это либо иметь логическое значение isValid; (вместе с нулевым значением по умолчанию v неудачный конструктор) или выбросить исключение, которое никогда не будет информативным при получении его от полевых пользователей.

Черт возьми, код правильный, я пишу тысячи конструкторов строк и делаю то, что мне нужно. Я использую isValid при создании объекта - другими словами, двухстрочные конструкторы - но по какой-то причине я перехожу на статический шаблон factory. Мне просто кажется, что вы можете многое сделать, если в вызове метода все еще есть проблемы с sync (), но значения по умолчанию можно «заменить» лучше (безопаснее)

Я думаю, что здесь нам нужно решить проблему с нулевым значением как значение по умолчанию для чего-то String one = new String (""); в качестве переменной-члена, а затем выполняется проверка на null перед присвоением строки, переданной конструктору.

Очень впечатляет количество необработанной, стратосферной информатики, выполненной на Java.

C ++ и так далее имеют библиотеки поставщиков, да. Java может обогнать их на крупномасштабных серверах из-за огромного набора инструментов. Изучите блоки статического инициализатора, оставайтесь с нами.

все еще есть проблемы с sync (), но значения по умолчанию можно «заменить» лучше (безопаснее)

Я думаю, что нам нужно здесь решить проблему нулевого значения по умолчанию по отношению к чему-то String one = new String ( ""); в качестве переменной-члена, а затем выполняется проверка на null перед присвоением строки, переданной конструктору.

Очень впечатляет количество необработанной, стратосферной информатики, выполненной на Java.

C ++ и так далее имеют библиотеки поставщиков, да. Java может обогнать их на крупномасштабных серверах из-за огромного набора инструментов. Изучите блоки статического инициализатора, оставайтесь с нами.

все еще есть проблемы с sync (), но значения по умолчанию можно «заменить» лучше (безопаснее)

Я думаю, что нам нужно здесь решить проблему нулевого значения по умолчанию по отношению к чему-то String one = new String ( ""); в качестве переменной-члена, а затем выполняется проверка на null перед присвоением строки, переданной конструктору.

Очень впечатляет количество необработанной, стратосферной информатики, выполненной на Java.

C ++ и так далее имеют библиотеки поставщиков, да. Java может обогнать их на крупномасштабных серверах из-за огромного набора инструментов. Изучите блоки статического инициализатора, оставайтесь с нами.

затем выполняется проверка на null перед присвоением строки, переданной конструктору.

Очень впечатляет количество необработанной, стратосферной информатики, выполненной на Java.

C ++ и так далее имеют библиотеки поставщиков, да. Java может обогнать их на крупномасштабных серверах из-за огромного набора инструментов. Изучите блоки статического инициализатора, оставайтесь с нами.

затем выполняется проверка на null перед присвоением строки, переданной конструктору.

Очень впечатляет количество необработанной, стратосферной информатики, выполненной на Java.

C ++ и так далее имеют библиотеки поставщиков, да. Java может обогнать их на крупномасштабных серверах из-за огромного набора инструментов. Изучите блоки статического инициализатора, оставайтесь с нами.

1
ответ дан 22 November 2019 в 20:13
поделиться

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

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

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

void MyParameterizedFunction(String param1, int param2, Boolean... params) {
    assert params.length <= 1;
    bool 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]);
    bool 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 ++ проверяет их во время компиляции.

80
ответ дан 22 November 2019 в 20:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: