用Java中的自定义类替换默认的String类

时间:2011-01-18 09:59:17

标签: java string standard-library

我想实现自己的String类,并在使用双引号时让Java使用它 它看起来应该是这样的:MyString s = "foo"和java.lang.String不应该被实例化。

这是否可以在不触及编译器的情况下实现? 怎么做?

我问的原因是我需要在一个程序中需要验证最坏情况执行时间的字符串。为了验证它,所有循环必须是有界的(绑定在注释中指定)。 此外,为了方便起见,我希望能够使用双引号,因为写MyString s = new MyString({'f','o','o'})确实会降低可读性。

4 个答案:

答案 0 :(得分:3)

如果不触及编译器,则无法实现。

甚至不可能继承String。 (您只能提供自己的java.lang.ChareSequence实施,但这不会有太大帮助。)

答案 1 :(得分:2)

你可以寻找非常复杂的解决方案,例如在运行时修改你的字节码,在你使用String的地方使用MyString,例如使用像ASM这样的框架,但祝你好运!

http://asm.ow2.org/

尝试以另一种方式获得相同的结果可能是一个更好的主意......

答案 2 :(得分:2)

您可以替换String类。获取String的源代码,更改它保持所有方法签名相同,编译它并将其添加到您的bootclasspath。注意:这将替换所有字符串,而不仅仅是代码中的字符串。它也可能不符合您的使用许可。 ;)

如果您担心可读性,可以创建一个辅助方法

MyString s = s("Hello");

如果你想做的只是减缓你的应用程序,你可以做很多事情,比如;

  • 使用你能找到的最慢的机器。在ebay上有很多便宜的。
  • 禁用JIT。
  • 启用调试。
  • 启用分析并跟踪每个方法调用和对象创建。

答案 3 :(得分:2)

Stringer文字只被实例化一次,所以不要担心时间成本。

MyString s = new MyString("foo")

这对你的目的来说没问题。始终只创建一个String "foo"个实例。 (即使多个源文件包含"foo"文字)。这几乎就好像

static private final String $foo = JVM.findOrCreateString('f','o','o');
...
MyString s = new MyString($foo);