我有一个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)
我当然愿意接受更好/更优雅的解决方案
答案 0 :(得分:0)
我可以在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!
),因此编译器不会明确地使您意识到这一点。