Подтвердить что ты не робот

Расширить java.lang.String

java.lang.String объявляется окончательным, однако существуют ли какие-либо механизмы, доступные законным или иным образом, для его расширения и замены метода equals (String other)?

4b9b3361

Ответ 1

Нет, абсолютно нет. Если вы хотите какую-то "другую" строку, создайте другой тип, который может содержать строку:

public final class OtherString {
    private final String underlyingString;

    public OtherString(String underlyingString) {
        this.underlyingString = underlyingString;
    }        

    // Override equals however you want here
}

Ответ 2

Я думаю, что ближе всего вы можете сделать некоторый класс, который реализует CharSequence. Большинство методов JDK-манипуляций принимают CharSequence. StringBuilder. В сочетании с хорошей реализацией toString(), различными методами String и valueOf(), вы можете приблизиться к естественной замене.

Ответ 3

Невозможно напрямую наследовать класс String, поскольку он является окончательным. Также являются завершающими классами оболочки java.lang.Integer, java.lang.Float и т.д.

Ответ 4

Вы не можете расширить класс, отмеченный как final. Вы можете использовать композицию, чтобы поместить объект String внутрь, или вы можете вручную перевернуть свою собственную версию. Это может быть достигнуто с помощью массивов символов и другой магии, которая входит в создание классов String.

Ответ 5

Теперь есть способ. С помощью манифольда можно расширить каждый класс Java. Вот пример для String:

package extensions.java.lang.String;

import manifold.ext.api.*;

@Extension
public class MyStringExtension {

  public static void print(@This String thiz) {
    System.out.println(thiz);
  }

  @Extension
  public static String lineSeparator() {
    return System.lineSeparator();
  }
}

Может быть использован следующим образом:

String name = "Manifold";
name.print();
String.lineSeparator();

Другой пример можно найти здесь: https://jaxenter.com/manifold-code-generator-part-2-151762.html.

Обратите внимание, что коллектор все еще альфа.