Как интерпретировать и переводить код Котлин в Java?

Я пытался перевести этот код Kotlin на Java, так как проект находится на Java. Я перевожу, глядя на синтаксис Kotlin. Однако есть и другие, которые мне трудно понять.

https://github.com/airbnb/lottie-android/blob/master/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/AppIntroActivity.kt

В частности:

private val animationView: LottieAnimationView by lazy {
    rootView.inflate(R.layout.app_intro_animation_view, false) as LottieAnimationView
}

private val viewPager: LockableViewPager by lazy {
    findViewById<LockableViewPager>(R.id.intro_activity_viewPager)
}

override fun generateFinalButtonBehaviour(): IntroButton.Behaviour {
    return object : IntroButton.Behaviour {
        override fun setActivity(activity: IntroActivity) { finish() }
        override fun getActivity(): IntroActivity? = null
        override fun run() {}
    }
}

private fun setViewPagerScroller() {
    try {
        val scrollerField = ViewPager::class.java.getDeclaredField("mScroller")
        scrollerField.isAccessible = true
        val interpolator = ViewPager::class.java.getDeclaredField("sInterpolator")
        interpolator.isAccessible = true

        val scroller = object : Scroller(this, interpolator.get(null) as Interpolator) {
            override fun startScroll(startX: Int, startY: Int, dx: Int, dy: Int, duration: Int) {
                super.startScroll(startX, startY, dx, dy, duration * 7)
            }
        }
        scrollerField.set(viewPager, scroller)
    } catch (e: NoSuchFieldException) {
        // Do nothing.
    } catch (e: IllegalAccessException) {
        // Do nothing.
    }
}

Для setViewPagerScrollerЯ смог перевести первую часть.

Field scrollerField = ViewPager.class.getDeclaredField("mScroller");
scrollerField.setAccessible(true);

Field interpolator = ViewPager.class.getDeclaredField("sInterpolator");
interpolator.setAccessible(true);

1 ответ

Решение

Метод setViewPagerScroller использует анонимный синтаксис внутреннего класса kotlin. Это часть объекта, которая не имеет реального аналога в синтаксисе Java.

private void setViewPagerScroller() {
    try {
        Field scrollerField = ViewPager.class.getDeclaredField("mScroller");
        scrollerField.setAccessible(true);

        Field interpolator = ViewPager.class.getDeclaredField("sInterpolator");
        interpolator.setAccessible(true);

        Scroller scroller = new Scroller(this, (android.view.animation.Interpolator) interpolator.get(null)){

            @Override
            public void startScroll(int startX, int startY, int dx, int dy, int duration) {
                super.startScroll(startX, startY, dx, dy, duration * 7);
            }
        }

        scrollerField.set(viewPager, scroller);
    } catch (NoSuchFieldException error) {
        // Do nothing.
    } catch (IllegalAccessException error) {
        // Do nothing.
    }
}

И as Ключевое слово как кастинг в Java. Надеюсь, вы можете использовать это для перевода fun generateFinalButtonBehaviour(), он содержит больше того же самого.

Конструкция Lazy, что неудивительно, становится более многословной в Java. Вы должны использовать дисциплину, чтобы не получить неправильный доступ к программе просмотра, если вы решите следовать структуре ниже.

private LockableViewPager viewPager;

private LockableViewPager getViewPager(){
    if(viewPager == null){
        // produce viewpager and store in field
    }
    return viewPager;
}  

Вы также можете использовать класс для более точного представления ленивой инициализации ваших полей. (Так что вы не можете по ошибке получить доступ к полю, которое вы имели в виду для ленивой инициализации). Это становится еще более многословным, но может стоить того.

Другие вопросы по тегам