java.lang.String объявляется окончательным, однако существуют ли какие-либо механизмы, доступные законным или иным образом, для его расширения и замены метода equals (String other)?
Расширить java.lang.String
Ответ 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.
Обратите внимание, что коллектор все еще альфа.