Convert Java File to Kotlin の後に その2 「apply」

View や Presenter内での処理振り分け.


private void showFilterLabel() {
    switch (mCurrentFiltering) {
        case ACTIVE_TASKS:
            mTasksView.showActiveFilterLabel();
            break;
        case COMPLETED_TASKS:
            mTasksView.showCompletedFilterLabel();
            break;
        default:
            mTasksView.showAllFilterLabel();
            break;
    }
}

android-architecture/TasksPresenter.java at todo-mvp · googlesamples/android-architecture

apply

同じオブジェクトに対して複数のメソッドをすばやく呼び出す必要がある場合は、apply {} を使用します


private fun showFilterLabel() {
    tasksView.apply {
        when (filtering) {
            TasksFilterType.ACTIVE_TASKS -> showActiveFilterLabel()
            TasksFilterType.COMPLETED_TASKS -> showCompletedFilterLabel()
            else -> showAllFilterLabel()
        }
    }
}

「with」との区別が良く話題になっていますので見ておくといいです.

Mindorks | Become a complete and happy Android developer

Convert Java File to Kotlin の後に その1「メンバとコンストラクタ」

Convert Java File to Kotlin の後に その2 「apply」

Convert Java File to Kotlin の後に その3 「Null Safety」

Convert Java File to Kotlin の後に その4 「lateinit」

Convert Java File to Kotlin の後に その5 「String Templates」


Convert Java File to Kotlin の後に その1「メンバとコンストラクタ」

まずは「Convert Java File to Kotlin」で変換してなんとなくは動いていますが.

一通り公式リファレンスは流し読みしていましたが

コードをみているとKotolinの持つ恩恵を得ているような気がしません.

逆に分かりづらくなったようにも思えたりします.

先人たちのコードを見ながら自然なKotlinコードに書き換えていきましょう.

メンバとコンストラクタ

以下のようなJavaコード.


public class TasksPresenter implements TasksContract.Presenter {

    private final TasksRepository mTasksRepository;

    private final TasksContract.View mTasksView;

    private TasksFilterType mCurrentFiltering = TasksFilterType.ALL_TASKS;

    private boolean mFirstLoad = true;

    public TasksPresenter(@NonNull TasksRepository tasksRepository, @NonNull TasksContract.View tasksView) {
        mTasksRepository = checkNotNull(tasksRepository, "tasksRepository cannot be null");
        mTasksView = checkNotNull(tasksView, "tasksView cannot be null!");

        mTasksView.setPresenter(this);
    }

android-architecture/TasksPresenter.java at todo-mvp · googlesamples/android-architecture

Kotlin のプロパティを使って適切に初期化します. ほとんどのメンバ変数に割り当てられたコンストラクタパラメータは必要ありません.


class TasksPresenter(val tasksRepository: TasksRepository, val tasksView: TasksContract.View)
    : TasksContract.Presenter {

    override var filtering = TasksFilterType.ALL_TASKS

    private var mFirstLoad = true

    init {
        tasksView.setPresenter(this)
    }

主コンストラクタに注釈や可視性修飾子がない場合は、コンストラクタキーワードを省略できます。

Classes and Inheritance - Kotlin Programming Language

Convert Java File to Kotlin の後に その1「メンバとコンストラクタ」

Convert Java File to Kotlin の後に その2 「apply」

Convert Java File to Kotlin の後に その3 「Null Safety」

Convert Java File to Kotlin の後に その4 「lateinit」

Convert Java File to Kotlin の後に その5 「String Templates」


公式「Guide to App Architecture」のサンプルコードに Retrofit が登場している件

きっと開発者は見たくなる

公式が言うところの「おすすめのアーキテクチャ」.

Guide to App Architecture | Android Developers

眺めているとこんなコードが..


public interface Webservice {
    /**
     * @GET declares an HTTP GET request
     * @Path("user") annotation on the userId parameter marks it as a
     * replacement for the {user} placeholder in the @GET path
     */
    @GET("/users/{user}")
    Call<User> getUser(@Path("user") String userId);
}

ん?

Retrofit だ.

Retrofit

サードパーティであるSquare産の通信ライブラリを公式のサンプルコードに利用している.

Volley じゃないんだ!?

interface を見せながらの構成説明が明快に伝わりやすいとしても.

今どきガチガチ社内でサードパーティライブラリ利用の話が進めやすくなっていく方も多いのではと想像.