Daha önce Java ile uğraşmısanız muhtemelen Java’da method overloading kavramını duymuşsunuzdur. Kotlin’de named arguments özelliği sayesinde tek bir method tanımlayarak aynı metodu birden fazla overload etmekten kurtuluyoruz. Alttaki gibi bir methodumuzun olduğunu düşünün.
1 2 3 |
fun bar(a:Int = 0, b: Double = 0.0, c:String = "default value"){ println("a = $a , b = $b ,c = $c") } |
ve üstteki metodu şöyle çağırabiliriz.
1 |
bar(1) |
çıktısı da alttaki gibi olacaktır.
1 |
a = 1, b = 0.0, c = default value |
Yazdığımız parametrelere verilen default değerler sayesinde bu metodu 4 farklı biçimde method overloading yapmadan çağırabiliriz. Java’da bunun için 4 farklı methodu overloading yaparak ayrı ayrı yazacaktık.
1 2 3 4 |
bar() bar(1) bar(1, 0.1) bar(1, 0.1, "Another value") |
Aynı şekilde constructor
kullanırken de property lere default parametre verebiliriz.
1 |
data class User(var name: String? = "", var birthday: Date? = Date(), var isLogin: Boolean = false) |
Örneğin alttaki gibi çağırımlar yapabiliriz.
1 2 |
User("Emre", Date(), true) User("Jonny") |
Bunu Java’da yapabilmek için 4 farklı constructor yazmamız gerekiyor.
Projenizde hem kotlin hem java kullandığınızı farzedin. Kotlin ile yukarıda yazdığımız method ve class tan oluşturacağımız nesneyi Java’da aynı şekilde çağırmamız mümkün değil. Nasıl yani? Hani bu ikili beraber sorunsuz çalışabiliyordu? Kotlin ile gelen en büyük özelliklerden biri zaten bu değil miydi? (interoperability)
Bu ikilinin yukarıda yazdığımız kodları beraber çalıştırabilmesi için tek yapmamız gereken @JvmOverloads
eklemek
Kodlarımızı düzenleyelim
1 2 3 4 5 |
@JvmOverloads fun bar(a:Int = 0, b: Double = 0.0, c:String="default value"){ println("a = $a , b = $b ,c = $c") } data class User @JvmOverloads constructor (var name: String? = "", var birthday: Date? = Date(), var isLogin: Boolean = false) |
Gördüğünüz gibi method için fun
anahtar kelimesinin hemen önüne constructor için ise constructor
anahtar kelimesinin önüne @JvmOverloads
yazmamız yeterli olacaktır.
Java’da kodun compile edilmiş hali alttaki gibi olacaktır.
Method için;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@JvmOverloads public static final void foo(int a, double b) { foo$default(a, b, (String)null, 4, (Object)null); } @JvmOverloads public static final void foo(int a) { foo$default(a, 0.0D, (String)null, 6, (Object)null); } @JvmOverloads public static final void foo() { foo$default(0, 0.0D, (String)null, 7, (Object)null); } |
Data class için;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@JvmOverloads public User(@Nullable String name, @Nullable Date birthday) { this(name, birthday, false, 4, (DefaultConstructorMarker)null); } @JvmOverloads public User(@Nullable String name) { this(name, (Date)null, false, 6, (DefaultConstructorMarker)null); } @JvmOverloads public User() { this((String)null, (Date)null, false, 7, (DefaultConstructorMarker)null); } |