我有以下代码:
enum class Items {
ITEM_1,
ITEM_2,
}我想补充一句:
AT_LEAST_ONE,在某种程度上等于ITEM_1 or ITEM_2ALL,意思是ITEM_1 and ITEM_2用例1:当我使用if (item == Items.AT_LEAST_ONE)时,它希望它实际上是指if (item == Items.ITEM_1 || item ==Items.ITEM_2)
用例2:当我在函数中使用它们作为参数时:calling_function(ALL)而不是calling_function( Items.ITEM_1,Items.ITEM_2)
在科特林有办法吗?
发布于 2020-12-17 18:41:33
您所要求的是不支持的。没有像枚举常量这样的东西,也就是其他枚举常数的集合。
但是,枚举类可以具有函数,所以您可以使用它来实现您想要的结果:
enum class Items {
ITEM_1,
ITEM_2;
fun isFoo(): Boolean =
this == ITEM_1 || this == ITEM_2
}现在您可以调用if (item.isFoo()),而不是建议的if (item == Items.ITEM_3)。
发布于 2020-12-17 19:14:52
正如Ben所说,枚举不是这样工作的--每个成员都是一个不同的对象实例,所以Item3必须是一个具体的、独特的东西,而不是代表其他对象的逻辑概念。
不过,如果您愿意,您可以获得与带有密封类的枚举类似的功能,并且可以使用这些类创建类型层次结构:
sealed class Items {
sealed class AT_LEAST_ONE : Items() {
// objects because there should be one, singleton instance of each
object ITEM_1 : AT_LEAST_ONE()
object ITEM_2 : AT_LEAST_ONE()
}
}
println("ITEM_1 is an Items: ${ITEM_1 is Items}")
println("ITEM_1 is AT_LEAST_ONE: ${ITEM_1 is AT_LEAST_ONE}")
> ITEM_1 is an Items: true
> ITEM_1 is AT_LEAST_ONE: true如果不需要,实际上不需要嵌套它们,层次结构是基于构造函数中的超级类型的。因此,您可以为事物创建您自己的组,如果您愿意,可以为它们提供多个类型的接口!
// no nesting, Items is the supertype, multiple types for some
interface Special
interface AT_LEAST_ONE
sealed class Items
object ITEM_1 : Items(), AT_LEAST_ONE, Special
object ITEM_2 : Items(), AT_LEAST_ONE
// casting because otherwise the compiler knows "is" will fail and complains
println("ITEM_2 is special: ${(ITEM_2 as Any) is Special}")
println("ITEM_1 is special: ${(ITEM_1 as Any) is Special}")
> ITEM_2 is special: false
> ITEM_1 is special: true唯一的问题是它不是枚举,所以不同的objects没有删除 enum ,所以如果需要的话,您必须自己解决。据我所知,枚举中也没有类似于values()方法的方法,即使编译器知道所有类型(因此它可以检查模式匹配是详尽的)
发布于 2020-12-18 06:43:21
您可以尝试将抽象函数添加到枚举类中,以满足额外条件。
我试着这样做:
enum class Items {
ITEM_1 {
override fun calculate(item: Items): Boolean = item == ITEM_1
},
ITEM_2 {
override fun calculate(item: Items): Boolean = item == ITEM_2
},
//AT_LEAST_ONE only for check
AT_LEAST_ONE {
override fun calculate(item: Items): Boolean = item == ITEM_1 || item == ITEM_2
},
//ALL only for check
ALL {
override fun calculate(item: Items): Boolean = item == ITEM_1 && item == ITEM_2
};
abstract fun calculate(item:Items): Boolean
enum class GetItem{
ALL{
override fun get(): List<Items> {
return listOf(ITEM_1,ITEM_2)
}
};
abstract fun get(): List<Items>
}
}这个枚举类的用法如下:
Log.e("ENUM TEST", "TEST ITEM_1 : (item == ITEM_1) ${Items.ITEM_1 == Items.ITEM_1}")
Log.e("ENUM TEST", "TEST ITEM_2 : (item == ITEM_2) ${Items.ITEM_2 == Items.ITEM_2}")
Log.e("ENUM TEST", "TEST AT_LEAST_ONE : (item == AT_LEAST_ONE) ${Items.AT_LEAST_ONE.calculate(Items.ITEM_1)}")
Log.e("ENUM TEST", "TEST ALL : (item == ALL) ${Items.ALL.calculate(Items.ITEM_1)}")
Log.e("ENUM TEST", "TEST ALL : (ALL == ALL) ${Items.ALL == Items.ALL}")
Log.e("ENUM TEST", "TEST ALL : (ALL == listOf(ITEM_1, ITEM_2) ${Items.GetItem.ALL.get().size}")https://stackoverflow.com/questions/65346419
复制相似问题