Могу ли я вызвать функцию в Kotlin с параметром по умолчанию и заставить его отсутствовать? - PullRequest
0 голосов
/ 10 февраля 2019

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

В моей конечной точке вход json распаковывается в DTO:

data class AddItemDTO(
    val name: String,
    val insertIndex :Int?
)

В моей конечной точке я вызываю службу:

myService.insertItem(parentId, addItemDTO.name, addItemDTO.insertIndex)

где parentId - это идентификатор объекта, содержащего коллекцию, в которую я хочу добавить элемент.Родительский объект имеет функцию для добавления элемента в коллекцию:

data class Parent() {
    ... other stuff
    private lateinit var _items: MutableList<Item>

    fun addItem(item: Item, insertIndex: Int = _items.size) {
        _items.add(insertIndex, item)
    }
}

В моем сервисе я хотел бы вызвать эту функцию с параметром по умолчанию, если он не равен нулю, и без него, если он равен нулю.Моя сервисная функция теперь выглядит так:

fun insertItem(parentId: UUID, name: String, insertIndex: Int?) {
    val parent = parentRepository.getOne(parentId)
    val item = Item(name)
    if (insertIndex == null) parent.addItem(item)
    else parent.addItem(item, insertIndex)
}

Это прекрасно работает, но я не нахожу if / else очень симпатичным.Мне было интересно, могу ли я вызвать метод в родительском методе по-другому, что-то вроде:

parent.addRound(item, insertIndex ?: void)

Конечно, я открыт для еще лучших / более элегантных решений

1 Ответ

0 голосов
/ 10 февраля 2019

Можно ли вызвать функцию в Kotlin с параметром по умолчанию и заставить его отсутствовать?

Нет, но вы можете сделать это следующим образом:

Так как_items является приватным в Parent, у вас нет возможности узнать, каким будет конечный индекс (запасной вариант).

Я бы поставил логику, которая решает, будет ли элемент вставлен в конец или в какой-то момент.другой индекс прямо внутри addItem, например:

data class Parent() {
    // ...
    private lateinit var _items: MutableList<Item>

    fun addItem(item: Item, insertIndex: Int?) {
        _items.add(insertIndex, item ?: _items.size)
    }
}

Таким образом, вы можете использовать оператор elvis по своему желанию.

insertItem просто проходит через insertIndex следующим образом:

fun insertItem(parentId: UUID, name: String, insertIndex: Int?) {
    val parent = parentRepository.getOne(parentId)
    parent.addItem(Item(name), insertIndex)
}

Примечание. Вы можете решить, что произойдет, если getOne вернет null.Поскольку это тип платформы (Parent!), компилятор явно не сообщит вам об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...