Я использую Kotlin отражение, чтобы проверить, являются ли атрибуты, которые имеют определенную аннотацию, нулевыми.
Учитывая следующий пример:
data class DataClass(
@SomeRandomAnnotation
val otherAnnotated: String?,
val inner: InnerClass
)
data class AnotherDataClass(
@SomeRandomAnnotation
val annotatedProperty: String?,
val dataClass: DataClass
) {
fun checkCreditAnalysisConstrain() {
print(checkConstrain(this))
}
}
И функция, которая проверяет это:
fun checkConstrain(parentClass: Any): List<String> {
val filter = parentClass::class.memberProperties.filter {
if (memberIsDataClass(it)) checkConstrain(getMemberPropertyInstance(parentClass, it))
hasAnnotation(it) && propertyIsNull(it, parentClass)
}
return filter.map { formatResult(parentClass, it) }
}
Идея состоит в том, что функция будет перебирать атрибуты моих классов, проверяя, есть ли у них аннотация, и проверяя, является ли значение нулевым. Если свойство является классом данных, код рекурсивно оценивает свойства дочерних элементов.
После этого я отображаю результаты, превращая KProperty в простую строку, удобную для чтения человеком, содержащую имя класса и имя атрибута.
Проблема в том, что приведенный выше код не работает должным образом. Возвращаемые свойства - это только свойства класса первого уровня.
Если вместо фильтра я просто запускаю forEach и печатаю результат, я получаю ожидаемые атрибуты. Так что я уверен, что это связано с повторением внутри фильтра.
Видите ли вы какой-нибудь способ сделать это более функциональным способом? Я просто обеспокоен тем, что мне не понадобится список «temp», и я добавлю значения в список, а затем сброслю его.