Замена класса String по умолчанию на собственный класс в Java - PullRequest
2 голосов
/ 18 января 2011

Я хотел бы реализовать свой собственный класс String и заставить Java использовать его, когда я использую двойные кавычки.
Это должно выглядеть так: MyString s = "foo" и не следует создавать экземпляр java.lang.String.

Возможно ли это, не касаясь компилятора?
Как это будет сделано?

Причина, по которой я спрашиваю, состоит в том, что мне нужны строки в программе, которые необходимо проверить для выполнения в худшем случаевремя.Чтобы проверить это, все циклы должны быть ограничены (граница указана в комментарии).Кроме того, я хотел бы иметь возможность использовать двойные кавычки для удобства, потому что написание MyString s = new MyString({'f','o','o'}) действительно снижает читабельность.

Ответы [ 4 ]

3 голосов
/ 18 января 2011

Это невозможно без касания компилятора.

Даже подкласс String невозможно. (Вы можете указать только свою собственную реализацию java.lang.ChareSequence, но это не сильно поможет.)

2 голосов
/ 18 января 2011

Литералы Stringer создаются только один раз, поэтому не беспокойтесь о стоимости времени.

MyString s = new MyString("foo")

Это хорошо для вашей цели. Только один String экземпляр "foo" когда-либо создан. (Даже если несколько исходных файлов содержат литерал "foo"). Это почти как если бы

static private final String $foo = JVM.findOrCreateString('f','o','o');
...
MyString s = new MyString($foo);
2 голосов
/ 18 января 2011

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

  • используйте самую медленную машину, которую вы можете найти.На ebay есть много дешевых.
  • отключите JIT.
  • включите отладку.
  • включите профилирование и отслеживайте все вызовы методов и создание объектов.*
2 голосов
/ 18 января 2011

Вы можете искать действительно сложные решения, такие как изменение вашего байт-кода во время выполнения, чтобы использовать MyString везде, где вы используете String, с использованием, например, фреймворка, такого как ASM, но удачи в этом!

http://asm.ow2.org/

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

...