Tarihsel olarak bazı dillerde (örneğin, C++), programlama, kullanıcı tanımlı veri türlerini daha "doğal" bir şekilde kullanılabilir hale getirmek için standart operatörlerin aşırı yüklenmesine (operator overloading) izin vermektedir. Java'nın dil tasarım aşamasında, fazla karmaşıklık ve kodun zor okunabilirliğini önlemek için operatörlerin aşırı yüklenmemesi yönünde bir karar alınmıştır.
Problem şu ki, bazen gerçekten de kendi nesneleri için operatörlerin davranışlarını tanımlamak pratik olurdu; örneğin, vektörleri toplamak için + operatörünü, ancak bu Java'da sözdizimi düzeyinde mümkün değildir.
Çözüm - nesnelerle çalışmak için normal yöntemler tanımlamak (örneğin, add, multiply) ya da karşılaştırma için equals() ve compareTo() yöntemlerini geçersiz kılmak; ya da tasarım kalıpları uygulamak (örneğin, "Builder" veya "Composite" kalıbı) gibi standart yaklaşımlar kullanmaktır.
Koda örnek:
public class Vector { private int x, y; public Vector(int x, int y) { this.x = x; this.y = y; } public Vector add(Vector other) { return new Vector(this.x + other.x, this.y + other.y); } @Override public String toString() { return "Vector(" + x + ", " + y + ")"; } } Vector v1 = new Vector(1, 2); Vector v2 = new Vector(3, 4); Vector sum = v1.add(v2); // "Vector(4, 6)"
Anahtar özellikler:
equals(), compareTo() yöntemleri; aritmetik işlemler için ise kendi yöntemleri kullanılırJava'da == operatörünü kendi sınıflarınız için değerleri karşılaştıracak şekilde "aşırı yükleyebilir misiniz"?
Hayır, == operatörü her zaman sınıf nesneleri için referansları karşılaştırır. Nesne değerlerini karşılaştırmak için equals() yöntemini geçersiz kılmak ve onun kullanılmasını sağlamak gerekir.
Kendi sınıflarınız için "a + b" davranışını sağlamak mümkün mü?
Sadece normal yöntemler aracılığıyla, örneğin a.add(b) ile. C++ gibi operatör aşırı yüklemesi sözdizimi desteklenmez.
String'ler (dize) Java'da + operatörünün aşırı yüklenmiş bir operatörü gibi davranmıyor mu?
Aslında, + ile stringlerin birleştirilmesi yalnızca String türü için çalışır ve derleyici seviyesinde desteklenir - bu özel bir sözdizimi kuralıdır.
== operatöründen nesne değerlerini karşılaştırmasını beklemeka + b gibi bir kod yazmaya çalışmak, oysa bu sözdizimi mümkün değilequals() ve hashCode() yöntemlerini uygulamamak, bu da koleksiyonlarla ilgili hatalara yol açarBir geliştirici "Nokta" sınıfı için iki noktayı karşılaştırmak için == kullanır ve eşleşen koordinatlar olduğunda true döneceğini bekler.
Artılar:
Eksiler:
Bir geliştirici, noktaların içeriğini karşılaştırmak için equals() yöntemini uygular ve toplama için add() yöntemini kullanır.
Artılar:
Eksiler: