Charsequence або string stack overflow російською

CharSequence це інтерфейс з усіма наслідками, що випливають. Під капотом може бути CharBuffer, Segment, String, StringBuffer, StringBuilder. Або власна реалізація.

Щоб було розуміння наведу такий приклад:

Метод SoutString виводить клас і вміст рядка:

Якщо ми захочемо використовувати StringBuilder. то для того що б скористатися методом SoutString ми повинні використовувати перетворення. Так як він очікує String:

Додаємо ці рядки і дивимося результат:

Ми так само знаємо, що String і StringBuilder реалізують інтерфейс 'CharSequence' і це дозволяє нам написати наступне:

Висновок буде наступним:

Відзначимо той факт, що в другому випадку в метод був переданий StringBuilder.

  • Ми можемо передавати в наш метод будь-які класи, які реалізують інтерфейс.
  • Усередині методу можна використовувати методи інтерфейсу, наприклад length ();

А ще ми можемо всередині методу безпечно виконати специфічні для об'єкта дії:

Я не знавець Android, але думаю, що @Barmaley хотів сказати що якщо передається в якості CharSequence об'єкт String. то буде виводиться просто текст. А якщо об'єкт додатково реалізує Spannable. то його ще можна і розфарбувати.

Формально звичайно CharSequence це інтерфейс, але смислове навантаження CharSequence в Android зазвичай передбачає, що набір символів може мати в подальшому якісь стилі - конкретно Spannable. ну наприклад, можна зробити щоб частина рядка мав інший колір або шрифт.

Відповідно CharSequence має сенс використовувати, якщо передбачається, що частинах рядка потрібно / можна надавати певні специфічні характеристики - тобто те чого не можна домогтися лобовим використанням String.

відповідь даний 12 Жовтня '15 о 8:45

Раптово Spannable теж інтерфейс. - Sergey Mitrofanov 12 Жовтня '15 о 9:46

@SergeyMitrofanov і що далі то? Якщо ви з розряду грама-наці з Java ухилом так і скажіть :) - Barmaley 12 Жовтня '15 в 9:51

CharSequence - це будь-який набір символів, не обов'язково іммутабельний, як об'єкт String. У цьому інтерфейсі визначено буквально 4 методу. У android його реалізують як різні рядки і їх білдери (String, StringBuilder, і т.п.), так і текст з форматуванням (Spanned).

Будь CharSequence можна перетворити в рядок методом .toString (). але це може бути перетворення з втратою інформації. Наприклад, якщо перетворити в рядок текст з форматуванням (Spanned), то з нього піде все форматування, а якщо перетворити StringBuilder, то втратиться можливість редагування цього рядка. Крім того, таке перетворення - це майже завжди створення нового об'єкта.

Використовувати краще всюди, де досить 4 методів інтерфейсу CharSequence і не потрібні можливості класу String, або потрібно зберегти властивості переданого об'єкта при передачі кудись далі. Але потрібно бути обережним. Зокрема, краще не використовувати метод equals () для порівняння об'єктів, так як він може бути не визначений, або визначений не так, як ви хотіли б.

відповідь даний 12 Жовтня '15 о 14:55

Схожі статті