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

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

27 голосов
/ 23 февраля 2012

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

Ответы [ 5 ]

26 голосов
/ 23 февраля 2012

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

public final class OtherString {
    private final String underlyingString;

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

    // Override equals however you want here
}
18 голосов
/ 27 августа 2013

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

3 голосов
/ 27 декабря 2015

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

2 голосов
/ 23 февраля 2012

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

1 голос
/ 28 февраля 2019

Теперь есть способ. С коллектором возможно расширить каждый класс 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...