Java, operatör aşırı yüklemesine doğrudan destek sağlamaz, örneğin C++'da olduğu gibi. Tarihsel olarak, bu kısıtlama, kodun okunabilirliğini artırmak ve belirsizliği azaltmak amacıyla getirilmiştir: Bjarne Stroustrup (C++'ın yaratıcısı) ve James Gosling (Java'nın yaratıcısı) bu konuyu tartışmış ve Java'da geliştiricilerin kendi sınıfları için operatörlerin özelleştirilmesine izin vermeme kararı alınmıştır.
Operatör aşırı yüklemesi sorunu, kullanıcı sınıfları için aritmetik ve mantık tanımında aşırı özgürlüğün, izlenmesi zor hatalara ve kodun okunabilirliğinin bozulmasına yol açabilmesidir, özellikle büyük ekiplerde.
Çözüm — kullanıcı tanımlı operatör aşırı yüklemesini yasaklamaktır. Yine de, Java kendi sınıflarında yöntem aşırı yüklemesini (overloading) desteklemekte ve operatörlerin davranışı açıkça tanımlanmış yöntemler aracılığıyla taklit edilebilir (örneğin, .add(), .equals(), .compareTo() vb.).
Kod örneği:
public class Vector2D { private final int x, y; public Vector2D(int x, int y) { this.x = x; this.y = y; } public Vector2D add(Vector2D other) { return new Vector2D(this.x + other.x, this.y + other.y); } } Vector2D v1 = new Vector2D(2, 3); Vector2D v2 = new Vector2D(1, 4); Vector2D sum = v1.add(v2); // v1 + v2 yerine
Anahtar özellikler:
Java'da kendi sınıfım için "+" operatörünü aşırı yükleyebilir miyim?
Cevap: Hayır, Java, oluşturulan sınıflar için kullanıcı tanımlı aritmetik operatör aşırı yüklemesini desteklememektedir. Tek istisna dizgiler içindir: "+" operatörü StringBuilder ile birleştirme işlemini gerçekleştirir.
equals() metodunu tanımlarsam, "==" operatörü değer karşılaştırması yapar mı?
Cevap: Hayır, "==" operatörü nesnelerin referanslarını karşılaştırır, içeriklerini değil. Değerlerin doğru bir şekilde karşılaştırılması için yeniden tanımlanmış equals() kullanılmalıdır.
String a = new String("hello"); String b = new String("hello"); System.out.println(a == b); // false System.out.println(a.equals(b)); // true
Standart operatörlerin belirli sınıflar için özel bir davranışı var mı?
Cevap: Java'da "özel" davranış yalnızca String için "+" operatörü ile ve ilkel türler için (otomatik artırma ve unboxing) uygulanmıştır. Diğer sınıflar için operatörler standart olarak çalışır (yani aşırı yüklenmez).
Genç bir geliştirici Money isimli bir sınıf yazdı ve iki nesneyi "==" ile karşılaştırdı, değerler üzerinden karşılaştıracaklarını düşündü. Bu, üretim ortamında yalnızca eşitlik kontrolü sırasında hatalara neden oldu.
Artılar:
Eksiler:
Projede kendi Vector sınıfı yazıldı, tüm aritmetik işlemler açıkça tanımlandı, nesneler için == operatörü kullanılmadı ve belge yöntemlerin çalışma mantığını açıkladı.
Artılar:
Eksiler: