Kotlin, operator anahtar kelimesi aracılığıyla operator overloading'i destekler. Bu, kullanıcı tanımlı türler için standart operatörlerin (+, -, *, [], == vb.) özel çalışma mantığını tanımlamanıza olanak tanır:
operator modifikasyonu ile işaretlemeniz gerekir.Örnek:
data class Vec2(val x: Int, val y: Int) { operator fun plus(other: Vec2) = Vec2(x + other.x, y + other.y) } val a = Vec2(1,2) val b = Vec2(2,3) val c = a + b // operator fun plus'ı çağırır
Nuanlar ve en iyi uygulamalar:
== ve equals uyumlu olmalıdır).
==operatörünün aşırı yüklenmesi ileequals()metodunun yeniden tanımlanması arasındaki fark nedir?
Cevap: Kotlin'deki == operatörü her zaman equals() metodunu çağırır (önce null kontrolü ile). Eğer operator fun equals(other: Any?): Boolean tanımlarsanız, == operatörü her zaman bu metodu kullanır. == ve equals()'un farklı çalışmasını sağlamak mümkün değildir.
data class Point(val x: Int, val y: Int) { override operator fun equals(other: Any?): Boolean { ... } } val a = Point(1,2) val b = Point(1,2) println(a == b) // a.equals(b) çağırır
Tarih
Açık bir anlam olmadan compareTo operatörünü aşırı yükledik:
Point sınıfında sıralamalarda kullanılabilmesi için operator fun compareTo tanımladık. Ancak "büyük" ve "küçük" açık bir anlam taşımıyordu, ekip üyeleri farklı mantıklar yazıyordu. Sonuç — koleksiyonları sıralarken karmaşık hatalar.
Tarih
İki taraflı tipler için operatörlerin simetrisini unuttuk:
Geliştirici operator fun plus(a: Matrix, b: Vector): Matrix uyguladı, ancak Vector + Matrix için çalışmayı sağlamadı çünkü simetrik işlevselliği sağlamadı. Sonuç olarak vector + matrix derlenemedi, yalnızca matrix + vector çalıştı. Bu, kodun birçok bölümünde hatalara neden oldu.
Tarih
get operatörünün hatalı aşırı yüklenmesi:
Geliştirici operator fun get(index: Int): Foo aşırı yüklemesi yapan özel bir sınıf oluşturdu. Sınır dışı kontrolü eklemedi — ve var olmayan bir elemana erişim girişimi geçersiz alanlar içeren bir nesne döndürdü, istisna fırlatmadı — bu, iş mantığında "görünmez" hataların ortaya çıkmasına neden oldu.