CharSequence= arayüz
String= somut uygulama
Dedin:
birinden diğerine dönüştürme
Kaynağından dönüştürme yok String.
- Her
Stringnesne olan birCharSequence .
- Herkes
CharSequenceüretebilir String. Arayın CharSequence::toString. Olursa CharSequencea String, yöntem kendi nesnesine bir başvuru döndürür.
Başka bir deyişle, her Stringbiri bir CharSequence, ama her CharSequencebiri 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 Listyerine ArrayList, LinkedListya 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
Stringsize tamamen bellekte, tek bir metin parçası var biliyorum ve sabittir.
- A ile
CharSequence, somut uygulamanın belirli özelliklerinin ne olabileceğini bilmiyorsunuz.
CharSequenceNesne metnin muazzam bir yığın temsil eder ve bu nedenle bellek etkileri vardır olabilir. Veya aradığınızda birbirine dikilmesi gereken toStringve 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 Stringnesneyi veya bir StringBufferveya gibi başka bir şey iletebilir StringBuilder. Yönteminizin kodu, geçirilen her şeyi kullanır ve CharSequenceyöntemlerden herhangi birini çağırır .
Dönüştürmek için en yakın kodunuz bir alır CharSequenceve bir ihtiyacınız olduğunu biliyorum String. Belki de arayüze yazılmak Stringyerine sınıfa yazılan eski kodlarla CharSequencearayü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 . CharSequenceArayü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 CharSequenceolarak 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.
