java необязательный параметр метода
Необязательные параметры в Java
Как использовать дополнительные параметры в Java? Какая спецификация поддерживает дополнительные параметры?
16 ответов
varargs может сделать это (в некотором роде). Кроме этого, необходимо указать все переменные в объявлении метода. Если вы хотите, чтобы переменная была необязательной, вы можете перегрузить метод, используя подпись, которая не требует параметра.
существует несколько способов моделирования необязательных параметров в Java:
перегрузка методов.
одним из ограничений этого подхода является то, что он не работает, если у вас есть два дополнительных параметра одного типа, и любой из них можно опустить.
С varargs.
a) все опционные параметры такого же типа:
b) типы необязательные параметры могут отличаться:
основным недостатком этого подхода является то, что если необязательные параметры имеют разные типы, вы теряете статическую проверку типа. Кроме того, если каждый параметр имеет разное значение, вам нужно каким-то образом их различать.
Nulls. чтобы устранить ограничения предыдущих подходов, вы можете разрешить нулевые значения, а затем проанализировать каждый параметр в теле метода:
теперь все значения аргументов должны быть предоставлены, но по умолчанию они могут быть null.
дополнительный класс. этот подход похож на nulls, но использует дополнительный класс Java 8 для параметров, которые имеют значение по умолчанию:
необязательно делает контракт метода явным для вызывающего абонента, однако можно найти такую подпись слишком многословной.
обновление: Java 8 включает класс java.util.Optional из коробки, поэтому никакая потребность использовать гуава для этой цели в Java 8. Однако имя метода немного отличается.
шаблон строителя. шаблон builder используется для конструкторов и реализуется путем введения отдельного класса Builder:
карты. когда количество параметров слишком велико и для большинства из них обычно используются значения по умолчанию, вы можете передать аргументы метода в виде карты их имена/значения:
обратите внимание, что вы можете комбинировать любой из этих подходов, чтобы добиться желаемого результата.
Вы можете использовать что-то вроде этого:
на params переменной не является обязательным. Он рассматривается как nullable массив объектов.
странно, я ничего не мог найти об этом в документации, но он работает!
Это «новое» в Java 1.5 и выше (не поддерживается в Java 1.4 или более ранней версии).
Я вижу, что пользователь bhoot упомянул об этом ниже.
есть дополнительные параметры с Java 5.0. Просто объявите свою функцию следующим образом:
вы можете позвонить с doSomething(); или doSomething(true); сейчас.
к сожалению, Java не поддерживает параметры по умолчанию напрямую.
однако я написал набор аннотаций JavaBean, и один из них поддерживает параметры по умолчанию, такие как:
обработчик аннотаций генерирует перегрузки метода для правильной поддержки этого.
в Java нет дополнительных параметров. Вы можете перегрузить функции, а затем передать значения по умолчанию.
были упомянуты VarArgs и перегрузка. Другой вариант шаблона, который будет выглядеть примерно так:
хотя этот шаблон будет наиболее подходящим для того, когда вам нужны дополнительные параметры в конструкторе.
в JDK>1.5 вы можете использовать его как это:
Это будет зависеть от того, чего вы хотите достичь, varargs или перегрузка метода должны решить большинство сценариев.
но имейте в виду, чтобы не перегружать метод использования. это приводит в замешательство.
короткая версия :
используя три точки:
(на основе ответа @VitaliiFedorenko)
вы можете сделать это, используя метод перегрузки, как это.
также вы можете использовать аннотацию @нам!—4—>
просто передать null в качестве первого параметра.
Если вы передаете переменную того же типа, вы можете использовать это
перегрузка в порядке, но если есть много переменных, которым нужно значение по умолчанию, вы получите :
поэтому я бы предложил использовать аргумент переменной, предоставленный Java. Вот ссылке для объяснения.
Java теперь поддерживает optionals в 1.8, я застрял с программированием на android, поэтому я использую nulls, пока не смогу рефакторировать код для использования дополнительных типов.
вы можете использовать класс, который работает как строитель, чтобы содержать ваши необязательные значения.
используя этот подход, вы можете указать дополнительные значения в произвольном порядке без какой-либо двусмысленности. Вы также можете иметь параметры разных классов в отличие от varargs. Этот подход будет еще лучше, если вы можете использовать аннотации и генерацию кода для создания класса Options.
аргументы по умолчанию не могут использоваться в Java и C#. Где в C++ и Python мы можем их использовать..
в Java, мы должны использовать 2 метода (функции), а не с параметрами по умолчанию.
мы можем сделать необязательный параметр методом перегрузки или с помощью типа данных.
самый простой способ-это
|*| тип данных. может быть необязательным параметром
Дополнительные параметры Java
Когда вы разрабатываете метод в классе Java, некоторые параметры могут быть необязательными для его выполнения. Независимо от того, находится ли он внутри DTO, объекта домена с толстой моделью или простого класса обслуживания без сохранения состояния, дополнительные параметры метода являются общими.
Но есть и другие варианты.
1.2. Дополнительные списки
Вместо нуля мы можем иногда создать пустое представление класса. Подумайте о коллекциях Java. Если метод принимает список или карту, вы никогда не должны использовать пустые значения в качестве входных данных.
Пустая коллекция всегда лучше нуля, потому что в большинстве случаев она не требует особой обработки.
Вы можете удивиться, зачем тратить память на создание пустых коллекций. В конце концов, нуль ничего вам не стоит.
Ваши сомнения оправданы. К счастью, есть простое решение.
Вы не должны создавать новый экземпляр коллекции, когда вам нужен пустой представитель. Повторно используйте один и тот же экземпляр в базе кода.
1.3. Шаблон нулевого объекта
Концепция пустых коллекций также применима к другим классам. Пустая коллекция — это обычная коллекция с нулевыми элементами. Точно так же вы можете думать о других объектах в ваших приложениях.
Нулевой объект — это особый экземпляр класса, который представляет отсутствующее значение. Если какой-либо метод ожидает объект в качестве параметра, вы всегда можете передать нулевое представление объекта, не беспокоясь о том, что это вызовет непредвиденное исключение во время выполнения.
Вы можете реализовать шаблон объекта Null двумя способами.
Для объектов простых значений достаточно экземпляра по умолчанию с предопределенными значениями, назначенными свойствам. Обычно этот объект Null выставляется как константа, поэтому вы можете использовать его несколько раз. Например:
Если ваш объект Null также должен имитировать некоторое поведение, демонстрируемое методами, простой экземпляр может не работать. В этом случае вы должны расширить класс и переопределить такие методы.
Вот пример, который расширяет предыдущий:
Выделенный объектный класс Null позволяет разместить множество угловых шкафов в одном месте, что делает обслуживание намного более приятным.
1.4. Перегрузка метода
Если вы разрабатываете метод с необязательными параметрами, вы можете предоставить перегруженные версии этого метода. Каждый метод должен принимать только те параметры, которые необходимы.
При таком подходе не нужно ожидать, что вызывающая сторона предоставит значения по умолчанию для необязательных параметров. Вы передаете значения по умолчанию внутри перегруженного метода. Другими словами, вы скрываете значения по умолчанию для необязательных параметров от вызывающих методов.
Перегруженные методы могут вызывать друг друга, но это не обязательно. Вы можете реализовать каждый метод независимо, если это более удобно. Однако обычно вы проверяете все параметры и помещаете логику в метод с самым длинным списком параметров.
Стоит отметить, что перегрузка методов широко используется в стандартной библиотеке Java. Когда вы научитесь разрабатывать API, учитесь у людей с большим опытом.
1,5. Параметр Шаблон объекта
Решает ли это проблему необязательных параметров метода?
Он просто перемещает задачу в конструктор объекта параметра.
Давайте посмотрим, как мы можем решить эту более общую проблему с …
2. Необязательные параметры конструктора
С точки зрения проблемы с необязательными параметрами, простые конструкторы не отличаются от обычных методов-членов. Вы можете успешно использовать все методы, которые мы уже обсуждали, с конструкторами.
Однако, когда список параметров конструктора становится длиннее и многие из них являются необязательными параметрами, применение перегрузки конструктора может показаться громоздким.
Если вы согласны, вы должны проверить шаблон Builder.
2.1. Образец строителя
Давайте рассмотрим класс с несколькими необязательными полями:
Если бы вы создали конструкторы для покрытия всех возможных комбинаций необязательными параметрами, у вас получился бы довольно внушительный список.
Как избежать нескольких конструкторов? Используйте класс строителя.
Обычно вы реализуете конструктор как внутренний класс того класса, который он собирается построить. Таким образом, оба класса имеют доступ к своим личным членам.
Взгляните на конструктор класса из предыдущего примера:
Вместо общедоступного конструктора мы предоставляем только один статический метод фабрики для внутреннего класса компоновщика. Закрытый конструктор (который конструктор вызывает в методе build () ) использует экземпляр компоновщика для назначения всех полей и проверки наличия всех необходимых значений.
Это довольно простая техника, если подумать.
Код клиента этого компоновщика, который устанавливает только выбранный необязательный параметр, может выглядеть следующим образом:
С помощью компоновщика вы можете создавать все возможные комбинации с необязательными параметрами объекта.
2.2. Компилятор безопасных классов времени компиляции
К сожалению, просто взглянув на методы компоновщика из предыдущего абзаца, вы не сможете точно определить, какие параметры являются необязательными, а какие — обязательными. Более того, не зная, вы можете опустить необходимые параметры случайно.
Посмотрите на следующий пример неправильно используемого компоновщика:
Компилятор не сообщит ни об одной ошибке. Вы поймете проблему с отсутствующим обязательным параметром только во время выполнения.
Итак, как вы решаете проблему?
Вам нужно немного изменить метод фабрики компоновщика, чтобы его можно было вызывать только с необходимыми параметрами, а оставленные методы компоновщика — только для дополнительных параметров.
Вот все, что вам нужно изменить:
2,3. Создание класса Builder
Вы можете подумать, что сборщики требуют чертовски много кода.
3. Необязательные параметры Java-шаблонов
Просматривая веб-страницы в поисках подходов для работы с необязательными параметрами Java, вы можете найти несколько дополнительных предложений, которые мы уже рассмотрели. Позвольте мне объяснить, почему вы должны рассматривать их как неправильные подходы.
3.1. Карты
Технически говоря, вход метода — это набор пар ключ-значение. В Java у нас есть стандартная встроенная структура данных, которая соответствует этому описанию — Карта.
Компиляция не помешает вам использовать HashMap в качестве контейнера для всех необязательных параметров метода, но ваш здравый смысл должен.
Хотя вы можете поместить что-либо в такой HashMap, это неправильная идея. Этот подход труден для понимания, нечитаем и быстро станет вашим кошмаром обслуживания.
Все еще не убежден?
Вам определенно стоит подумать о том, чтобы сменить карьеру на разработчика JavaScript. В компании гораздо проще плакать.
3.2. Java Varargs
Просто чтобы быть ясно, нет ничего плохого в использовании Java Varargs. Если вы не знаете, сколько аргументов будет вызывать ваш метод, varargs идеально подойдет.
Но использование varargs в качестве контейнера для одного значения, которое может присутствовать или нет, является неправильным использованием. Такое объявление позволяет вызывать метод с более необязательными значениями, чем ожидалось. Мы обсудили гораздо более описательные подходы для обработки отдельных необязательных параметров.
3.3. Почему не опционально в качестве аргумента метода?
Наконец, самый спорный подход — Java 8 Необязательный метод ввода. Я уже написал пост о дополнительных вариантах использования, в которых я также рассмотрел параметры метода. Позвольте мне расширить то, что вы можете найти там.
Использование памяти
Когда вы создаете экземпляр класса Optional, вы должны выделить для него память. Хотя пустой необязательный экземпляр, доступ к которому осуществляется с помощью Optional.empty (), является одноразовым одноразовым (точно так же, как пустые коллекции, которые мы уже обсуждали), непустые экземпляры будут занимать операционную память.
Обтекание объектов с использованием дополнительных фабричных методов только с целью вызова метода, который немедленно развернет их, не имеет смысла, если сравнивать этот подход с другими возможностями.
Тем не менее, в настоящее время сборщики мусора хорошо справляются с недолговечными объектами. Распределение памяти не имеет большого значения. Есть ли у нас другие минусы?
Кодирование с учетом читателя
Как насчет читаемости кода?
Возможно, это просто вопрос личных предпочтений, но для многих разработчиков множественные необязательные вызовы фабрики отвлекают. Шум в коде для читателя. Но опять же, это просто вопрос вкуса. Давайте найдем что-то более убедительное.
Мнение архитектора Java языка
Брайан Гетц, архитектор языка Java в Oracle, однажды заявил, что Optional был добавлен в стандартную библиотеку с учетом результатов методов, а не их входных данных.
Но разработчики программного обеспечения являются мятежниками и не любят прислушиваться к авторитетам. Этот аргумент также может показаться слабым. Мы должны идти глубже.
Решает ли Optional проблему с необязательными параметрами?
Если у вас есть объявление метода, подобное этому:
Сколько возможных входных данных вы должны ожидать?
Параметр может быть либо упакованным значением, либо пустым необязательным экземпляром. Так что ответ 2, верно?
Реальный ответ — 3, потому что вы также можете передать значение NULL в качестве аргумента. Вы должны иметь ограниченное доверие к входным данным, если вы не знаете, кто будет вызывать ваш API.
В этом случае, перед обработкой параметра вы должны проверить, не является ли Optional равным NULL, а затем, если значение присутствует. Довольно сложно, ты не согласен?
Я почти уверен, что еще не исчерпал тему. Поскольку это одна из потенциальных священных войн в Java-программировании, вам следует составить собственное мнение. Если вы хотите добавить что-то в список аргументов против Optional в качестве параметра метода, пожалуйста, поделитесь своими мыслями в комментариях. Это более чем приветствуется.
Вывод
Давайте вспомним то, что мы узнали. У Java нет возможности установить значение по умолчанию для параметров метода. Язык предоставляет нам много других альтернатив для обработки необязательных параметров.
Если вы найдете статью полезной, я буду благодарен за то, что поделился ею с вашими подписчиками. Я также хотел бы знать ваши мысли, все комментарии приветствуются.
Мнения, высказанные участниками Java Code Geeks, являются их собственными.
Java Необязательно
Java Необязательно, Java 8 Необязательно, Пример Java Необязательно, Учебник По Java Необязательно, Java Необязательно, если присутствует, Дополнительный фильтр, Дополнительный пример карты, Дополнительный Java
В этой статье мы рассмотрим необязательный класс Java, который был представлен в Java 8.
Java Необязательно
Необязательный пример Java 8
Давайте рассмотрим пример, чтобы получить четкое представление о том, когда было бы полезно использовать объекты Необязательного класса.
Как мы видим, мы хотим отфильтровать список строк и получить значение, длина которого превышает пороговое значение.
В нашем случае очень большая строка не будет содержать никакого значения, поэтому ничего не будет напечатано.
Дополнительный API Java 8 предоставляет несколько таких методов. В следующих разделах мы рассмотрим их подробно.
Дополнительные методы Java
логическое значение isPresent() : Оно возвращает значение true, если присутствует значение, в противном случае значение false.
void ifPresent(потребительский потребитель) : Если значение присутствует, этот метод вызывает указанного потребителя со значением, в противном случае ничего не делает. Как мы видим, в нашем первом примере:
T get() : Если значение присутствует в необязательном, этот метод возвращает значение, в противном случае вызывает исключение NoSuchElementException. Как вы, возможно, уже догадались
также будет напечатана
также будет выведено то же значение.
статический необязательный (значение T) : Возвращает необязательный параметр с указанным текущим ненулевым значением.
Дополнительные улучшения класса Java 9
Java 9 представила несколько дополнительных методов в необязательном классе:
Java необязательный параметр метода
Если переменные и константы хранят некоторые значения, то методы содержат собой набор операторов, которые выполняют определенные действия.
Общее определение методов выглядит следующим образом:
Модификаторы и параметры необязательны.
По умолчанию главный класс любой программы на Java содержит метод main, который служит точкой входа в программу:
Ключевые слова public и static являются модификаторами. Далее идет тип возвращаемого значения. Ключевое слово void указывает на то, что метод ничего не возвращает.
Создадим еще несколько методов:
Но если мы скомпилируем и запустим данную программу, то мы ничего не увидим на консоли. В примере выше мы определили два метода, но мы их нигде не вызываем. По умолчанию в программе Java выполняется только метод main и все его содержимое. Поэтому, если мы хотим, чтобы другие методы тоже выполнялись, их надо вызвать в методе main.
Вызов метода осуществляется в форме:
Например, определим и выполним несколько методов:
В методе main вызывается один раз метод hello и два раза метод welcome. В этом и заключается одно из преимуществ методов: мы можем вынести некоторые общие действия в отдельный метод и затем вызывать многократно их в различных местах программы. Поскольку оба метода не имеют никаких параметров, то после их названия при вызове ставятся пустые скобки.
В итоге после компиляции и выполнения программы мы увидим на консоли:
Иметь несколько необязательных параметров
Есть ли возможность поставить два или более (одного типа, например: 2 логических параметра)
Код: Что у меня сейчас:
6 ответов
Что касается обозначения varargs ( boolean. ): параметр varargs всегда должен быть последним, поэтому у вас может быть только один из них.
Вы можете рассмотреть возможность передачи null для пропущенных параметров или попробовать какую-нибудь перегрузку метода, как предлагал Батсеба.
Если вы хотите иметь несколько необязательных параметров
Затем вы можете получить доступ к значениям в виде массива, например,
Это немного запоздалый ответ, но в Java есть var-args вместо необязательных параметров, и, как говорили другие, вы можете использовать только один для каждого метода, а параметр var-arg должен быть последним в методе.
Тогда доступны следующие альтернативы.
Первый вариант означает ручное указание количества логических значений в перегруженном методе, а второй вариант принимает два массива логических значений. Ваши аргументы var-args в конечном итоге будут интерпретироваться как массивы после того, как они все равно войдут в метод.
Java поддерживает необязательные параметры в форме аргументов-переменных, но каждый метод может иметь только 1 параметр-аргумент-переменную, и он должен быть последним в списке параметров (Varargs).
Java поддерживает методы перегрузки, и Java может различать методы с разными сигнатурами методов. Это означает, что методы внутри класса могут иметь одно и то же имя, если у них разные списки параметров:
Попробуйте использовать шаблон построителя при работе с несколькими или необязательными параметрами
Java не поддерживает необязательные параметры в функциях.
Вместо этого предоставьте перегрузку функции следующим образом:
Конечно, таким образом можно установить более одного параметра по умолчанию, и у вас может быть несколько перегрузок для поддержки различных схем по умолчанию.