我想实现自己的 String 类,并在使用双引号时让 Java 使用它。
它应该看起来像这样:MyString s = "foo"
并且 java.lang.String 不应该被实例化。
不接触编译器有可能吗?
怎么做?
我问的原因是我需要程序中的字符串需要验证最坏情况的执行时间。为了验证它,所有循环都必须有界(边界在注释中指定)。此外,为了方便起见,我希望能够使用双引号,因为写作MyString s = new MyString({'f','o','o'})
确实会降低可读性。
我想实现自己的 String 类,并在使用双引号时让 Java 使用它。
它应该看起来像这样:MyString s = "foo"
并且 java.lang.String 不应该被实例化。
不接触编译器有可能吗?
怎么做?
我问的原因是我需要程序中的字符串需要验证最坏情况的执行时间。为了验证它,所有循环都必须有界(边界在注释中指定)。此外,为了方便起见,我希望能够使用双引号,因为写作MyString s = new MyString({'f','o','o'})
确实会降低可读性。
不接触编译器是不可能的。
甚至不可能对 String 进行子类化。(你只能提供你自己的实现java.lang.ChareSequence
,但这不会有太大帮助。)
您可以替换 String 类。获取 String 的源代码,更改它以保持所有方法签名相同,编译它并将其添加到您的引导类路径中。注意:这将替换所有字符串,而不仅仅是代码中的字符串。它也可能不符合您的使用许可。;)
如果您担心可读性,您可以创建一个辅助方法
MyString s = s("Hello");
如果您只想减慢应用程序的速度,您可以做很多事情,例如;
您可以寻找真正复杂的解决方案,例如在运行时修改字节码以在任何使用 String 的地方使用 MyString,例如使用 ASM 之类的框架,但祝您好运!
尝试通过另一种方式获得相同的结果可能是一个更好的主意......
Stringer 文字只实例化一次,所以不用担心时间成本。
MyString s = new MyString("foo")
这对你的目的来说很好。只创建了一个String
实例"foo"
。(即使多个源文件包含"foo"
文字)。这几乎就像
static private final String $foo = JVM.findOrCreateString('f','o','o');
...
MyString s = new MyString($foo);