Java имитирует параметр по умолчанию в функции - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть следующие функции:

public BottomSheetBuilder addItem(int id, @StringRes int title, @DrawableRes int icon) {
   return addItem(id, mContext.getString(title), ContextCompat.getDrawable(mContext, icon));
}

public BottomSheetBuilder addItem(int id, @StringRes int title, Drawable icon) {
   return addItem(id, mContext.getString(title), icon);
}

public BottomSheetBuilder addItem(int id, String title, @DrawableRes int icon) {
   return addItem(id, title, ContextCompat.getDrawable(mContext, icon));
}

public BottomSheetBuilder addItem(int id, String title, Drawable icon) {
   mAdapterBuilder.addItem(id, title, icon, mItemTextColor, mItemBackground, mIconTintColor);
   return this;
}

Мне нужно добавить третий параметр типа Boolean.

Если этот параметр равен true или ничего не передано, тогда null, тогда он должен добавить элемент.

Если оно ложно, его нельзя добавлять.

Ex:

.addItem(0, "0", null)
.addItem(1, "1", null, false)
.addItem(2, "2", null, true)
.addItem(3, "3", null, false)

Несколько советов?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Нет параметров по умолчанию в Java. Вам нужно создать две версии каждой функции - одну с тремя параметрами, одну с четырьмя параметрами. Одна из трех параметров вызывает четыре параметра, одна со значением «по умолчанию» для четвертого параметра. Там на самом деле нет ярлыка.

Если вы сделали это много, вы могли бы взглянуть на написание анализатора аннотаций, который мог бы искать аннотацию и автоматически добавлять версию с 3 параметрами в зависимости от наличия аннотации в функции. Но учитывая, что это несколько часов работы, если вы знаете, как написать анализатор аннотаций, это того не стоит.

0 голосов
/ 05 ноября 2018

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

public void methodA() {
    methodA(true); // default is true
}

public void methodA(boolean param) {
    // do stuff ...

Или, начиная с Java 8, вы можете использовать класс Optional<T> в качестве параметра, который может содержать значение или может быть пустым (тогда вы обрабатываете его как значение по умолчанию). Но тогда вам всегда нужно вызывать метод с необязательным параметром, даже если вы хотите вызвать значение по умолчанию Optional.empty()

Я не фанат Optional, но если у вас много методов и вы не хотите удваивать их количество, возможно, этот класс Optional будет лучшим выбором для вас.

public BottomSheetBuilder addItem(int id, @StringRes int title, @DrawableRes int icon, Optional<Boolean> add)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...