Değiştirilemez nesneler için arayüzleri bildirmeyin
[EDIT] Söz konusu nesnelerin Veri Aktarım Nesnelerini (DTO'lar) veya Eski Eski Verileri (POD) temsil ettiği yerlerde
Bu makul bir rehber mi?
Şimdiye kadar, çoğu zaman mühürlü sınıflar için değişmeyen arayüzler oluşturdum (veriler değiştirilemez). Değişkenliğe önem verdiğim yerde arayüzü kullanmamaya özen göstermeye çalıştım.
Ne yazık ki, arayüz kodu yıpratmaya başlar (ve endişelendiğim sadece benim kodum değil). Bir arabirimden geçirildikten sonra kuruyorsunuz ve daha sonra, kendisine iletilen şeyin değişmez olduğunu varsaymak isteyen bir koda geçmek istiyorsunuz.
Bu sorun nedeniyle, değişmez nesneler için hiçbir zaman arabirimler bildirmeyi düşünmüyorum.
Bunun, Birim Testine ilişkin sonuçları olabilir, fakat bunun dışında, bu makul bir kılavuz gibi görünüyor mu?
Yoksa gördüğüm "yayılma arayüzü" sorununu önlemek için kullanmam gereken başka bir örnek var mı?
(Bu değişmez nesneleri birkaç nedenden dolayı kullanıyorum: Temelde, çok iş parçacıklı kod yazdığım için iş parçacığı güvenliği için; ancak aynı zamanda, yöntemlere iletilen nesnelerin savunma kopyalarını almaktan kaçınabileceğim anlamına geliyor. Kod, çok daha basit hale geliyor Bir şey değişmez olduğunu bildiğiniz zaman birçok durumda - ki eğer bir arayüz kullandıysanız bunu yapmazsınız.Aslında, bir arayüz sağlamazsa, bir arayüz üzerinden referans verilen bir nesnenin savunma kopyasını bile yapamazsınız. klonlama işlemi veya seri hale getirmenin herhangi bir yolu ...)
[DÜZENLE]
Nesneleri değişmez yapmak isteme nedenlerim için çok daha fazla bağlam sağlamak için, Eric Lippert'in şu blog gönderisine bakın:
http://blogs.msdn.com/b/ericlippert/archive/tags/immutability/
Ayrıca burada, çok iş parçacıklı iş kuyruğlarında manipüle edilen / geçirilen öğeler gibi bazı alt düzey konseptlerle çalıştığımı da belirtmeliyim. Bunlar aslında DTO'lar.
Ayrıca Joshua Bloch , Etkili Java kitabında değişmez nesnelerin kullanılmasını önerir .
Takip et
Geri bildiriminiz için teşekkürler. Bu kılavuzu DTO'lar ve ilkleri için kullanmaya karar verdim. Şimdiye kadar iyi çalışıyor, ama sadece bir hafta oldu ... Yine de, iyi görünüyor.
Bununla ilgili sormak istediğim başka konular da var; özellikle "Derin veya Sığ Dalgısızlık" ("Derin ve Sığ klonlamadan çaldığım terminoloji") olarak adlandırdığım bir şey - ama bu başka bir zaman için bir soru.
List<Number>
tutabilir ki Integer
, Float
, Long
, BigDecimal
, vb ... Bütün bunlar kendilerini değişken değildir.