Типичное Android-приложение: Dagger, RxJava, вот это всё.

Осваивая разработку под андроид, я прошел обучение на курсе от сообщества скилл-бранч. В конце обучения мы делали выпускной проект, который я писал на котлине. В дальнейшем на собеседованиях я показывал этот проект и мне часто говорили что я пишу на котлин как на джава что не коректно. Так же один мой знакомый показывал мой код тех лиду в Альфа Банке который так же подверг мой код определенной критике. Помогите разобраться, что же у меня не так в коде. Заранее спасибо.

Александр


Неидиоматичный Kotlin-код

companion object {
    val INSTANCE = DataManager()
}

Coding Conventions

Именование

Android

ReactiveX

Тайпкастинг

Рефлексия

Всё это весело и изящно, но по большей части бестолково, особенно после ProGuard.

String genericName = ((Class) ((ParameterizedType) screen.getClass().getGenericSuperclass()).getActualTypeArguments()[0]).getName();
get() {
    val layout: Int

    val screen: Screen?
    screen = this.javaClass.getAnnotation(Screen::class.java)
    if (screen == null) {
        throw IllegalStateException("@ScreenAnnotations is missing on screen " + scopeName)
    } else {
        layout = screen.value
    }
    return layout
}

Итак, объект ищет на себе аннотацию, и, если её не окажется, бросает исключение (т. е. её наличие обязательно). Почему бы не использовать вместо этого базовые возможности языка и получить более простой и надёжный код?

abstract val layoutResId: Int
Screen screen; // зачем разделять объявление и присваивание?
screen = inKey.getClass().getAnnotation(Screen.class);
if (screen == null) {
    throw new IllegalStateException("@Screen annotation is missing in screen " + ((AbstractScreen) inKey).getClass());
} else {

Ну и вообще, сложновато понять, что TreeKeyDispatcher делает. (Развешивает ключи по деревьям. Ваш Капитан.)

Другое

Субъективщина