CharSequence tanımlaması neden (CharSequence) içermiyor?


11

Bu, sözleşmeler aynı olduğundan hem Java SE hem de Android için geçerlidir.

CharSequencebir contains(CharSequence)yöntem tanımlamaz . CharSequence#toString()Bir karakter dizisini kontrol etmek için çağrı yapma ihtiyacını önleyerek, bunun oldukça yararlı olacağının bir nedenini bulamıyorum .

Örneğin, Android'de, kullanıcılar, tanımlanmış Editable#toString()olsa bile kaçınılabilecek olsa da, Editableuygular da bir dizi karakter içerip içermediğini görmek için çağrı yapmak zorunda kalırlar .CharSequenceCharSequencecontains(CharSequence)

Bu tasarım seçiminin ardındaki fikir nedir? Potansiyel bir gözetim mi, yoksa bunun bir tasarım nedeni var mı?

Yanıtlar:


10

Noktası CharSequence, bir karakter dizisine salt okunur bir görünüm sağlamak için, ve bu. Bu arabirim herhangi bir dize düzenleme veya arama yöntemi sağlamaz. Bunlar kapsam dışı.

Arabirim Ayırma İlkesi, bir tür istemcilerin kullanmadığı yöntemlere bağlı olmaması gerektiğini önerir. Bu nedenle, bir arabirim yalnızca minimal kullanışlı kümesi bildirmelidir. Farklı bir kullanım senaryosunun farklı yöntemlere ihtiyacı varsa, farklı bir arayüz olmalıdır.

Yalnızca bir karakter kaynağına ihtiyaç duyan bir istemcinin arama yöntemlerine ihtiyacı yoktur.

Elbette bu Prensibi aşmak ve bin küçük arayüze sahip olmak mümkündür. Bu da iyi değil. Bu yüzden CharSequencearayüz sadece minimal charAt()ve length()yöntemleri değil, aynı zamanda derinden ilgili kolaylık yöntemini de içerir subSequence(). (Bir CharSequence muhtemelen bir dize kopyası olmadan bir alt diziye bir görünüm sağlayabilir, bu yüzden bunun bir örnek yöntemi olması gerekir). Belirtme toString()tamam çünkü bu yöntem yine de devralınacak Object. Yöntemler chars()ve bir arayüze codePoints()uyum sağlar. Bunlar varsayılan yöntemler olduğundan, sınıfların uygulanması için ek gereksinimler getirmezler .CharSequenceStreamCharSequence

CharSequenceBir yöntem (örneğin Dize vs CharBuffer vs StringBuilder) özel uygulamasını belirtmeden genel karakter kaynağını gerektiğinde türü yararlıdır. String#join()Ve String#contains()yöntemler kullanılarak iyi örneklerdir CharSequences.

Harici olarak uygulanabileceği CharSequenceiçin bir contains()yöntem sağlamak gerekli değildir . Java, C # 'ın genişletme yöntemlerinin kolaylığına sahip olmasa da, statik bir yöntem esasen aynı şeydir. Yani boolean Editable#contains(CharSequence needle)senin yerine bir static boolean contains(CharSequence haystack, CharSequence needle). Dize arama algoritmaları , iyi çalışılmış bir bilgisayar bilimi konusudur. Farklı değiş tokuşlara sahip farklı algoritmalar kolayca kullanılabilir.

Daha fazla okuma:


2
Sen söz " Bu arayüz. Bunlar kapsamı dışındadır. Herhangi bir dize manipülasyon veya arama yöntemleri sağlamaz " ama containsbir mutasyon yöntemi değildir ve orada yok exist arama yöntemleri ( charAt), bu yüzden bu nasıl geçerlidir ?. Ayrıca, " Bunlar varsayılan yöntemler olduğundan, CharSequence uygulayan sınıflar için ek gereksinimler getirmezler. " - Sınıfların uygulanması gereksinimi kaldırılarak, implcontains aracılığıyla varsayılan return to String().contains(...)olarak uygulanamadı mı?
Vince Emigh

1
@VinceEmigh Evet, contains()varsayılan bir yöntem olabilir. Varsa, bunun yerine uygulanmamalıdır: String#containsDiğer taraftan: String, CharSequence uygulamasını kullanmalıdır. charAt()Farklıdır. Bir arama algoritması uygulamaz, aşağıdakilerin önemli bir parçasıdır CharSequence: onsuz, içerikler gibi farklı bir türe kopyalanamazdı String. Akışlar, Java8'in önemli bir parçasıdır ve bu varsayılan yöntemleri eklemek, gibi diğer arayüzlere yapılan eklemelerle uyumludur Collection.
amon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.