Я наткнулся на некоторый код Java, который имел следующую структуру:
public MyParameterizedFunction(String param1, int param2)
{
this(param1, param2, false);
}
public MyParameterizedFunction(String param1, int param2, boolean param3)
{
//use all three parameters here
}
Я знаю, что в C ++ я могу присвоить параметру значение по умолчанию. Например:
void MyParameterizedFunction(String param1, int param2, bool param3=false);
Поддерживает ли Java этот вид синтаксиса? Есть ли причины, по которым этот двухэтапный синтаксис предпочтительнее?
public MyParameterizedFunction(String param1, int param2)
- это конструктор, а не метод, объявление.Ответы:
Нет, структура, которую вы нашли, - это то, как Java обрабатывает ее (то есть с перегрузкой вместо параметров по умолчанию).
Конструкторы см. В разделе 1 «Эффективная Java: Руководство по языку программирования» (рассмотрим статические фабричные методы вместо конструкторов), если перегрузка усложняется. Для других методов может помочь переименование некоторых случаев или использование объекта параметра. Это когда у вас достаточно сложности, чтобы дифференцировать сложно. Определенный случай, когда вы должны различать, используя порядок параметров, а не только число и тип.
источник
static
в 2015 году все в значительной степени считалось вредным. Напечатайте безопасные беглыеBuilder
экземпляры, которые обеспечивают выполнение полных и действительных контрактов на строительство, теперь гораздо лучшее решение.new
. Они используются все время в новом коде. Построители простых объектов значений часто являются результатом чрезмерного проектирования.Нет, но вы можете использовать шаблон Builder , как описано в ответе на переполнение стека .
Как описано в связанном ответе, шаблон Builder позволяет писать код
в котором некоторые поля могут иметь значения по умолчанию или иным образом быть необязательными.
источник
Student s1 = new Student().age(16);
, это оставило бы вас со студентом без имени, что могло бы быть плохо. Если это не плохо, то ваше решение в порядке.Есть несколько способов симулировать параметры по умолчанию в Java:
Метод перегрузки.
Одним из ограничений этого подхода является то, что он не работает, если у вас есть два необязательных параметра одного типа, и любой из них может быть опущен.
С переменным числом аргументов.
а) Все необязательные параметры имеют одинаковый тип:
б) Типы необязательных параметров могут быть разными:
Основным недостатком этого подхода является то, что если дополнительные параметры имеют разные типы, вы теряете статическую проверку типов. Кроме того, если каждый параметр имеет разное значение, вам нужен какой-то способ их различения.
Нулевые. Чтобы устранить ограничения предыдущих подходов, вы можете разрешить нулевые значения, а затем проанализировать каждый параметр в теле метода:
Теперь все значения аргументов должны быть предоставлены, но значения по умолчанию могут быть нулевыми.
Необязательный класс. Этот подход аналогичен пустым значениям, но использует необязательный класс Java 8 для параметров со значением по умолчанию:
Необязательно делает контракт метода явным для вызывающей стороны, однако, такая сигнатура может оказаться слишком многословной.
Образец строителя. Шаблон Builder используется для конструкторов и реализуется путем введения отдельного класса Builder:
Карты. Если число параметров слишком велико и для большинства из них обычно используются значения по умолчанию, вы можете передать аргументы метода в виде карты их имен / значений:
Обратите внимание, что вы можете комбинировать любой из этих подходов для достижения желаемого результата.
источник
return this
делать? Кроме того, неFooBuilder().setA("a").build();
так ли (по определению) конструктор вызывается первым иFooBuilder()
возвращает значение, не значит.setA("a"):
ли это, что у него нет возможности быть вызванным?return this
возвращает тот же объект, для которого был вызван метод (в примере,FooBuilder
). Это позволяет объединять методы в одном выражении, действующем для одного и того же объекта: иnew FooBuilder().setA(..).setB(..).setC(..)
т. Д., А не вызывать каждый метод в отдельном выражении.new FooBuilder()
возвращаетFooBuilder
объект, для которогоsetA
вызывается метод. КакsetB
не вызывается,this.b
сохраняет значение по умолчанию. Наконецbuild
метод вызывается для этогоFooBuilder
объекта.build
Метод создает и возвращаетFoo
объект , который устанавливается в переменнуюFoo foo
. Обратите внимание, чтоFooBuilder
объект не хранится ни в одной переменной.К сожалению нет.
источник
К сожалению, да.
может быть написано в Java 1.5 как:
Но стоит ли вам зависеть от того, как вы относитесь к компилятору, генерирующему
за каждый звонок.
Для нескольких параметров по умолчанию:
может быть написано в Java 1.5 как:
Это соответствует синтаксису C ++, который допускает параметры по умолчанию только в конце списка параметров.
Помимо синтаксиса, есть различие, когда в нем есть проверка типов во время выполнения для переданных по умолчанию параметров, а тип C ++ проверяет их во время компиляции.
источник
assert
в производственном коде. Брось исключение.Нет, но вы можете очень легко подражать им. Что в C ++ было:
В Java это будет перегруженная функция:
Ранее упоминалось, что параметры по умолчанию вызывали неоднозначные случаи перегрузки функций. Это просто не соответствует действительности, мы можем видеть в случае с C ++: да, возможно, он может создавать неоднозначные случаи, но эти проблемы могут быть легко решены. Он просто не был разработан в Java, возможно, потому, что создатели хотели гораздо более простой язык, чем был C ++ - если они имели право, это другой вопрос. Но большинство из нас не думают, что он использует Java из-за его простоты.
источник
Вы можете сделать это в Scala, которая работает на JVM и совместима с Java-программами. http://www.scala-lang.org/
т.е.
источник
Нет , но самый простой способ реализовать это :
или вместо троичного оператора вы можете использовать
if
:источник
Я мог бы заявить об очевидном здесь, но почему бы просто не реализовать параметр «по умолчанию» самостоятельно?
по умолчанию вы должны использовать
и если вы не хотите использовать значение по умолчанию, вы бы использовали
источник
//This is better public class Foo() { /* This does something */ public void func(String s){ //do something } /* This does something else with b */ public void func(String s, boolean b){ // b was passed } }
//Than this public class Foo() { /* This does something unless b = value, then it does something else */ public void func(String s, boolean b = value){ If (b){ // Do Something } else{ // Do something else } } }
Как упоминалось в Scala, стоит упомянуть и о Kotlin . В параметрах функции Kotlin также могут быть значения по умолчанию, и они могут даже ссылаться на другие параметры:
Как и Scala, Kotlin работает на JVM и может быть легко интегрирован в существующие проекты Java.
источник
Нет.
Вы можете добиться того же поведения, передав Объект, который имеет умные значения по умолчанию. Но опять же, это зависит от того, что ваше дело под рукой.
источник
В общем, в Java нет большого (какого-либо) синтаксического сахара, так как они пытались создать простой язык.
источник
const
и былиgoto
бы зарезервированы ключевые слова, у которых нет реализации? - Особенноconst
то, что я с горечью скучаю -final
это не замена, и они это знали. - И если вы приняли осознанное решение никогда не внедрять,goto
вам не нужно резервировать ключевое слово. - А потом в Java Team обманули, сделав Label основаннымbreak
иcontinue
таким же мощным, как Паскальgoto
.Вместо использования:
Вы можете использовать дополнительные функции java, используя один метод:
Основное отличие состоит в том, что вы должны использовать классы-обертки вместо примитивных типов Java, чтобы разрешить
null
ввод.Boolean
вместоboolean
,Integer
вместоint
и так далее.источник
Это не поддерживается, но есть несколько вариантов, например, использование шаблона объекта параметра с некоторым синтаксическим сахаром:
В этом примере мы создаем
ParameterObject
значения по умолчанию и переопределяем их в разделе инициализации экземпляра класса.{ param1 = 10; param2 = "bar";}
источник
Попробуйте это решение:
источник
Вы можете использовать Java Method Invocation Builder для автоматической генерации компоновщика со значениями по умолчанию.
Просто добавьте @GenerateMethodInvocationBuilder к классу или интерфейсу и @Default к параметрам в методах, где вы хотите использовать значения по умолчанию. Конструктор будет создан во время компиляции, используя значения по умолчанию, которые вы указали в своих аннотациях.
И тогда вы можете вызывать методы.
Или установите любое другое значение по умолчанию.
источник
Аналогичный подход к https://stackoverflow.com/a/13864910/2323964, который работает в Java 8, заключается в использовании интерфейса с получателями по умолчанию. Это будет более детализированный пробел, но это будет насмешливо, и это здорово, когда у вас есть куча примеров, когда вы действительно хотите привлечь внимание к параметрам.
источник
Сейчас я потратил довольно много времени, чтобы выяснить, как использовать это с методами, которые возвращают значения, и я не видел пока никаких примеров, я подумал, что было бы полезно добавить это здесь:
источник
Вот как я это сделал ... возможно, это не так удобно, как иметь "необязательный аргумент" против вашего определенного параметра, но он выполняет свою работу:
Заметьте, что я могу вызвать одно и то же имя метода либо просто строкой, либо я могу вызвать его со строкой и логическим значением. В этом случае установка wipeClean в значение true заменит весь текст в моей TextArea указанной строкой. Если установить для параметра wipeClean значение false или оставить все вместе, просто добавьте предоставленный текст в TextArea.
Также обратите внимание, что я не повторяю код в этих двух методах, я просто добавляю функциональность возможности сброса TextArea путем создания нового метода с тем же именем только с добавленным логическим значением.
Я на самом деле думаю, что это немного чище, чем если бы Java предоставил «необязательный аргумент» для наших параметров, поскольку нам нужно было бы затем кодировать значения по умолчанию и т. Д. В этом примере мне не нужно беспокоиться об этом. Да, я добавил еще один метод в свой класс, но, по моему скромному мнению, в долгосрочной перспективе его легче читать.
источник
НЕТ, но у нас есть альтернатива в виде перегрузки функций.
вызывается, когда не передан ни один параметр
вызывается при передаче параметра "a"
вызывается при передаче параметра b
источник
Есть полдюжины или более проблем, таких как эта, в конце концов, вы получите статический шаблон фабрики ... см. API шифрования для этого. Сортировать сложно объяснить, но думайте об этом так: если у вас есть конструктор, по умолчанию или другой, единственный способ распространить состояние за пределы фигурных скобок - это либо иметь логическое значение isValid; (вместе со значением NULL в качестве значения по умолчанию v конструктор с ошибкой) или сгенерировать исключение, которое никогда не будет информативным при получении его от полевых пользователей.
Будь проклят код, я пишу тысячи конструкторов строк и делаю то, что мне нужно. Я использую isValid при построении объектов - другими словами, двухстрочные конструкторы - но по какой-то причине я перехожу на статический шаблон фабрики. Я просто думаю, что вы можете многое сделать, если вы в вызове метода, все еще есть проблемы с sync (), но значения по умолчанию можно «заменить» лучше (безопаснее)
Я думаю, что здесь нам нужно решить проблему с нулем как значение по умолчанию для чего-то String one = new String (""); в качестве переменной-члена, затем выполняет проверку на нулевое значение, прежде чем присваивать строку, переданную в конструктор.
Весьма примечательно, что на Яве сделано огромное количество необработанных стратосферных компьютерных наук.
C ++ и т. Д. Имеет библиотеки поставщика, да. Java может опередить их на крупных серверах, потому что это огромный набор инструментов. Изучите статические блоки инициализатора, оставайтесь с нами.
источник
Это не поддерживается в Java, как в других языках, например. Котлин.
источник
Вы можете использовать следующие
источник