Могу ли я добавить новые методы в класс String в Java? - PullRequest
23 голосов
/ 17 сентября 2008

Я хотел бы добавить метод AddDefaultNamespace() в класс String в Java, чтобы я мог набрать "myString".AddDefaultNamespace() вместо DEFAULTNAMESPACE + "myString", чтобы получить что-то вроде "MyDefaultNameSpace.myString". Я не хочу добавлять другой производный класс (например, PrefixedString).

Возможно, такой подход не подходит для вас, но я лично ненавижу использовать +. Но, в любом случае, возможно ли добавить новые методы в класс String в Java?

Спасибо и всего наилучшего.

Ответы [ 15 ]

1 голос
/ 17 сентября 2008

Лучше использовать StringBuilder, который имеет метод append () и выполняет ту работу, которую вы хотите. Класс String является окончательным и не может быть расширен.

0 голосов
/ 16 января 2010

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

Если вы используете Scala, вы можете использовать неявные преобразования, подобные этим:

object Snippet {
  class MyString(s:String) {
    def addDefaultNamespace = println("AddDefaultNamespace called")
  }
  implicit def wrapIt(s:String) = new MyString(s)

  /** test driver */
  def main(args:Array[String]):Unit = {
    "any java.io.String".addDefaultNamespace // !!! THAT is IT! OR?
  }
0 голосов
/ 17 сентября 2008

На самом деле, вы можете изменить класс String. Если вы отредактируете файл String.java, расположенный в src.zip, а затем пересоберите rt.jar, у класса String будет добавлено больше методов. Недостатком является то, что этот код будет работать только на вашем компьютере, или если вы предоставите свой String.class, и поместите его в путь к классам до по умолчанию.

0 голосов
/ 17 сентября 2008

Вы можете создать свою собственную версию класса String и добавить метод: -)

0 голосов
/ 17 сентября 2008

Класс Java String является окончательным, что делает его неизменным. Это по соображениям эффективности и что было бы чрезвычайно трудно логически расширить без ошибок; поэтому разработчики решили сделать его финальным классом, то есть он не может быть расширен наследованием.

Функциональность, которую вы хотите, чтобы ваш класс поддерживал, не является частью обычной ответственности String согласно принципу единой ответственности , пространство имен - это другая абстракция, оно более специализировано. Поэтому вы должны определить новый класс, который включает элемент String и поддерживает методы, необходимые для обеспечения требуемого управления пространством имен.

Не бойтесь добавлять абстракции (классы), это суть хорошего ОО дизайна.

Попробуйте использовать карту CRC для уточнения необходимой абстракции.

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