Если бы вы могли переключиться на Kotlin, закрытые классы могли бы вам очень помочь. Вот пример.
Допустим, у вас есть разные типы. Например, введите 1 и введите 2. А пока давайте подумаем только об этих двух типах. Мы можем использовать запечатанный класс, например:
sealed class MyType {
class Type1 : MyType()
class Type2 : MyType()
}
Теперь мы можем определить наши пары активности типа <->, например:
sealed class MyPair(type: MyType, activity: Activity) {
data class Pair1(val type: MyType.Type1, val activity: Activity1) : MyPair(type, activity)
data class Pair2(val type: MyType.Type2, val activity: Activity2) : MyPair(type, activity)
}
Мы соединяем MyType с деятельностью. Если нам нужно добавить другой тип, все, что нам нужно сделать, это добавить его в закрытый класс MyType. Если нам нужно сопоставить этот новый тип с определенным действием, мы добавим сопряжение в закрытом классе MyPair.
Чтобы получить тип, теперь мы можем использовать это:
fun getType(type: MyType) : KType? {
MyPair::class.nestedClasses
.map { it.memberProperties }
.filter { it.filter { it.returnType in MyType::class.nestedClasses
.map { it.createType()}}[0].returnType == type::class.createType() }
.map {it.filter { it.name == "activity" }}
.firstOrNull().let {
it?.first()?.let { return it.returnType }
}
return DefaultActivity::class.createType()
}
Конечно, вам придется изменить DefaultActivity, но код в методе getType не изменится, и у вас будет DefaultActivity, если вы просто добавите тип, сопоставленное Activity, если вы добавите карту для этого нового типа.
Последнее: вам придется изменить тип переменной типа "тип" с Int на MyType.