【发布时间】:2016-08-18 17:13:12
【问题描述】:
我有几个带有字段的data class,它们在表单中使用,如果任何字段已填写,则需要它们有一个方法返回true。
我不想为所有的类都重写这个,所以我现在这样做:
data class Order(var consumer: String, var pdfs: List<URI>): Form {
override val isEmpty(): Boolean
get() = checkEmpty(consumer, pdfs)
}
data class SomethingElse(var str: String, var set: Set<String>): Form {
override val isEmpty(): Boolean
get() = checkEmpty(str, set)
}
interface Form {
val isEmpty: Boolean
fun <T> checkEmpty(vararg fields: T): Boolean {
for (f in fields) {
when (f) {
is Collection<*> -> if (!f.isEmpty()) return false
is CharSequence -> if (!f.isBlank()) return false
}
}
return true;
}
}
这显然不是很漂亮也不是类型安全的。
在不将每个属性抽象为某种Field-type 的情况下,还有什么更惯用的方法?
澄清:我正在寻找的是一种详尽的when,例如通过提供所有允许的类型(String、Int、List、@ 987654329@) 和一个函数来判断它们是否为空。就像一个带有 isEmptyFormField 方法的“扩展接口”。
【问题讨论】: