CharSequence
= arayüz
String
= somut uygulama
Dedin:
birinden diğerine dönüştürme
Kaynağından dönüştürme yok String
.
- Her
String
nesne olan birCharSequence
.
- Herkes
CharSequence
üretebilir String
. Arayın CharSequence::toString
. Olursa CharSequence
a String
, yöntem kendi nesnesine bir başvuru döndürür.
Başka bir deyişle, her String
biri bir CharSequence
, ama her CharSequence
biri birString
.
Bir arayüze programlama
Android'de programlandığında, metin değerlerinin çoğunun CharSequence'da olması bekleniyor.
Neden? Faydası nedir ve CharSequence'ı String üzerinde kullanmanın ana etkileri nelerdir?
Genel olarak, bir arayüze programlama, somut sınıflara programlamadan daha iyidir. Bu esneklik sağlar, böylece başka bir kodu kırmadan belirli bir arayüzün somut uygulamaları arasında geçiş yapabiliriz.
Bir API geliştirirkenÇeşitli durumlarda çeşitli programcılar tarafından kullanılacak , mümkün olan en genel arayüzleri vermek ve almak için kodunuzu yazın. Bu, çağrı yapan programcıya, hangi bağlam için en iyi uygulama olursa olsun, bu arayüzün çeşitli uygulamalarını kullanma özgürlüğü verir.
Örneğin, Java Koleksiyonlar Çerçevesi'ne bakın . API verir veya nesnelerin sıralanmış koleksiyonunu sürerse, kullanırken de yöntemlerini bildirmek List
yerine ArrayList
, LinkedList
ya başka 3. taraf uygulama List
.
Birden fazla yerde kullanılacak bir API yazmak yerine, kodunuz tarafından yalnızca belirli bir yerde kullanılacak hızlı ve kirli küçük bir yöntem yazarken, belirli bir betondan ziyade daha genel arabirimi kullanmakla uğraşmanıza gerek yoktur. sınıf. Ancak o zaman bile, yapabileceğiniz en genel arayüzü kullanmak zarar verir.
Temel farklar nelerdir ve bunları kullanırken hangi sorunların beklendiği,
- Bir ile
String
size tamamen bellekte, tek bir metin parçası var biliyorum ve sabittir.
- A ile
CharSequence
, somut uygulamanın belirli özelliklerinin ne olabileceğini bilmiyorsunuz.
CharSequence
Nesne metnin muazzam bir yığın temsil eder ve bu nedenle bellek etkileri vardır olabilir. Veya aradığınızda birbirine dikilmesi gereken toString
ve bu nedenle performans sorunları olan, ayrı ayrı izlenen birçok metin parçası olabilir . Uygulama, uzak bir hizmetten metin alıyor olabilir ve bu nedenle gecikme etkileri vardır.
ve birinden diğerine dönüşüm?
Genelde ileri geri dönüşüm yapmayacaksınız. Bir String
olan bir CharSequence
. Metodunuz bunun bir zaman aldığını bildirirse CharSequence
, çağıran programcı bir String
nesneyi veya bir StringBuffer
veya gibi başka bir şey iletebilir StringBuilder
. Yönteminizin kodu, geçirilen her şeyi kullanır ve CharSequence
yöntemlerden herhangi birini çağırır .
Dönüştürmek için en yakın kodunuz bir alır CharSequence
ve bir ihtiyacınız olduğunu biliyorum String
. Belki de arayüze yazılmak String
yerine sınıfa yazılan eski kodlarla CharSequence
arayüz oluşturuyorsunuz. Ya da kodunuz tekrar tekrar döngü yapmak veya başka bir şekilde analiz etmek gibi metinle yoğun bir şekilde çalışacaktır. Bu durumda, olası herhangi bir performans isabetini sadece bir kez almak istersiniz, böylecetoString
öne . Ardından, tamamen bellekte tek bir metin parçası olarak bildiğiniz şeyi kullanarak çalışmalarınıza devam edin.
Bükülmüş tarih
Kabul edilen cevapta yapılan yorumları not edin . CharSequence
Arayüz mevcut sınıf yapıları üzerine sonradan, bu yüzden bazı önemli incelikler (vardır equals()
& hashCode()
). Sınıflar / arayüzler üzerinde etiketlenen çeşitli Java sürümlerine (1, 2, 4 ve 5) dikkat edin - yıllar içinde biraz çalkalama. İdeal CharSequence
olarak başlangıçtan itibaren yerinde olurdu, ama hayat böyle.
Aşağıdaki sınıf şemam, Java 7/8'de dize türlerinin büyük resmini görmenize yardımcı olabilir. Tüm bunların Android'de mevcut olup olmadığından emin değilim, ancak genel bağlam hala sizin için yararlı olabilir.