我可以在Kotlin中使用默认参数调用函数并强制其不存在吗?

时间:2019-02-10 12:24:19

标签: kotlin

我有一个API,允许某人将项目添加到有序集合中,他们可以选择提供该项目应插入的索引。如果不存在,则应将该项目添加到末尾。

在我的端点中,json输入被解组到DTO中:

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

在我的端点中,我致电服务:

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

其中parentId是保存要向其中添加项目的集合的实体的ID。父实体具有向集合添加项目的功能:

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 :(得分:0)

  

我可以在Kotlin中使用默认参数调用函数并强制其不存在吗?

否,但是您可以这样做:

由于_itemsParent中是私有的,因此您无法知道结束索引(备用)将是什么。

我将放置决定是在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!),因此编译器不会明确地使您意识到这一点。