多様なConstructorを@JvmOverloadsを使って簡略に書き換える。

初めに

(✿✪‿✪。)ノ🥀コンニチワ♡

不動産オーナーになりたい夢を毎日見ているOWNR by RENOSY Android開発のSugeunです。 OWNR by RENOSYは不動産投資を行なっているオーナーさんにもっと物件管理をし易く助けてくれる不動産オーナー向けのアプリケーションです。 私みたいに不動産を持っていないユーザーでもサンプル物件モードでオーナーの体験をすることができるので気軽に使ってみてください。

今回は多様な Constructorを簡略に使えるように助けてくれる@JvmOverloadsについて話をしたいと思います。

www.renosy.com

Constructorとは

Constructorは英語で構成者, 建設者の意味で、プログラミング的に生成者の役割を持ってます。 JavaとKotlinのコードを比べてみながら理解を深めてみましょう。

public class Food{

    private String name;
    private int price;
    private Boolean dessert;

    public Food(String name) {
        this(name, 0, true);
    }

    public Food(String name, int price) {
        this(name, price, true);
    }

    public Food(String name, int price, Boolean dessert) {
        this.name = name;
        this.price = price;
        this.dessert= dessert;
    }
}

上記のクラスはJavaのコードになります。クラスのメソッドを使ってメンバー変数にパラメタを代入しています。これをKotlinっぽく書き換えて見ましょう。

class Food constructor (val name: String) {  // クラスネーム右に付くダイレクトconstructorは省略可能です 。
    constructor(name: String, price: Int): this(name)
    constructor(name: String, price: Int, dessert: Boolean): this(name, price)
}

val food1 = Food("yakiniku")
val food2 = Food("yakiniku", 3500)
val food3 = Food("yakiniku", 3500, true)

コードの量がかなり減りました!上記のクラスをインスタンス化すると Classのインスタンス化するとき同じクラスで異なるパラメタによって違うインスタンスが作られます!

さらにもっと短く書くことも可能になります。

class Food(val name: String, val price: Int = 0, val dessert: Boolean = true) {
    // Do Something
}

@JvmOverloadsを使う利点として

Kotlinはクラスで貰ったパラメタをその場でメンバー変数として使うことができます。 ここで問題点は既存のJavaコードからKotlinで作られたクラスやオブジェクトを使う場合にエラーが起きることです。

なぜならこのような文法はJavaにはないのでCompile Errorになります。ここで@JvmOverloadsを使うことでこの問題を解決できます。

class Food @JvmOverloads constructor(
    val name: String, 
    val price: Int = 0, 
    val dessert: Boolean = true
) {
    // Do Something
}

@JvmOverloads constructorを使うことでJavaとの互換性も上がり、コードもKotlinっぽく簡略に書き換えた気がしてすっきりしますね❕

最後に

今回はKotlinの@JvmOverloadsについて調べてみました。 複数のConstructorを使っているアプリケーションならぜひ@JvmOverloadsをご検討してみてください。 お読みいただきありがとうございました。(✿✪‿✪。)ノ🌹