W Kotlinie obsługiwane jest przeciążanie operatorów (operator overloading) za pomocą słowa kluczowego operator. Umożliwia to definiowanie własnej logiki działania standardowych operatorów (+, -, *, [], ==, itd.) dla typów użytkownika:
operator.Przykład:
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 // wywoła operator fun plus
Niuanse i najlepsze praktyki:
== i equals powinny być ze sobą zgodne).Jakie są różnice między przeciążeniem operatora
==a nadpisywaniem metodyequals()?
Odpowiedź: Operator == w Kotlinie zawsze wywołuje metodę equals() (z wcześniejszym sprawdzeniem na null). Jeśli zdefiniujesz operator fun equals(other: Any?): Boolean, operator == zawsze użyje tej metody. Nie można sprawić, by == i equals() działały inaczej.
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) // wywoła a.equals(b)
Historia
Przeciążenie operatora compareTo bez wyraźnej semantyki:
W klasie Point zdefiniowano operator fun compareTo w celu możliwości użycia w sortowaniach. Jednak "większe" i "mniejsze" nie miały wyraźnego sensu, różni członkowie zespołu pisali różne logiki. Wynik — złożone błędy przy sortowaniu kolekcji.
Historia
Zapomniano o symetryczności operatorów dla obustronnych typów:
Programista zaimplementował operator fun plus(a: Matrix, b: Vector): Matrix, ale nie zapewnił działania dla Vector + Matrix, ponieważ nie zaimplementował symetrycznej funkcji.
W rezultacie wyrażenie vector + matrix nie kompilowało się, tylko matrix + vector działało. To spowodowało błędy w wielu częściach kodu.
Historia
Błędne przeciążenie operatora get:
Programista stworzył klasę customową, przeciążając operator fun get(index: Int): Foo. Nie dodał kontroli wyjścia poza zakres — i próba dostępu do nieistniejącego elementu zwracała obiekt z nieprawidłowymi polami, a nie rzucała wyjątkiem — co prowadziło do pojawienia się "niewidocznych" błędów w logice biznesowej.