2016/12/08の30分 Kotlinメモ🍟

2016/12/08の30分 Kotlinメモ🍟

書いてるコードは雑にここにあります。

github.com

Function Literals with Receiver

kotlinlang.org

なんかこんなコード書いてみたけど、便利そうだけどよくわからねー

class Hello {
  fun world() {
    println("Hello,world")
  }
}

fun hello(init: Hello.() -> Unit): Hello {
  val h = Hello()
  h.init()
  return h
}

hello {
    world()
    world()
}

以下とかちゃんと読めばわかるのかな?

kotlinlang.org

by - Delegated Properties

kotlinlang.org

便利そうー

所持しているオブジェクトに単に委譲するだけのメソッドを作る必要がなくなる。

interface Base {
    fun println()
    fun hoho(a: String): String
}

class BaseImpl(val x: Int) : Base {
    override fun hoho(a: String): String {
        return a.toUpperCase()
    }

    override fun println() {
        println(x)
    }
}

// by を使ってBaseインターフェースの全てのpublicメソッドをbに委譲するよう指定
// DerivedはBaseを継承はしていないけど、委譲してるので呼び出しは継承と同じ感じで呼び出せる
class Derived(b: Base) : Base by b {
    val a = "aaaaa"

    fun mmmmmm() {
        println(hoho(a))
    }
}


val bbbb = BaseImpl(10)
val dd = Derived(bbbb)
dd.println() // 10
println(dd.hoho("test")) // TEST
dd.mmmmmm() // AAAAA

Javaだと大変...長い...委譲するメソッド作らないとだしねー...

interface Base {
    void println();

    String hoho(String s);
}

static class BaseImpl implements Base {

    private final int x;

    public BaseImpl(int x) {
        this.x = x;
    }

    @Override
    public void println() {
        System.out.println(x);
    }

    @Override
    public String hoho(String s) {
        return s.toLowerCase();
    }
}

static class Derived {
    private final Base b;
    private final String a = "aaaaa";

    public Derived(Base b) {
        this.b = b;
    }

    public void println() {
        b.println();
    }

    public String hoho(String s) {
        return b.hoho(s);
    }

    public void mmmmmm() {
        System.out.println(b.hoho(a));
    }
}

public static void main(String[] s) {
    Base bbbb = new BaseImpl(10);
    Derived dd = new Derived(bbbb);
    dd.println();
    System.out.println(dd.hoho("test"));
    dd.mmmmmm();
}

まとめ

KotlinのコードコピペしてJavaに置き換えるのめっちゃ大変...