【问题标题】:Replacing the default String class with a custom class in Java用 Java 中的自定义类替换默认 String 类
【发布时间】:2011-06-10 23:56:48
【问题描述】:

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

不接触编译器就可以实现吗?
怎么做?

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

【问题讨论】:

    标签: java string standard-library


    【解决方案1】:

    不接触编译器是不可能的。

    甚至不可能对 String 进行子类化。 (您只能提供自己的java.lang.ChareSequence 实现,但这并没有多大帮助。)

    【讨论】:

      【解决方案2】:

      您可以寻找真正复杂的解决方案,例如在运行时修改字节码以在任何使用 String 的地方使用 MyString,例如使用 ASM 之类的框架,但祝您好运!

      http://asm.ow2.org/

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

      【讨论】:

      • 而且,是的,您的 MyString 类应该最终实现 java.lang.CharSequence
      【解决方案3】:

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

      MyString s = new MyString("foo")
      

      这对你的目的来说很好。只创建了一个 String"foo" 实例。 (即使多个源文件包含 "foo" 文字)。就好像

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

      【讨论】:

        【解决方案4】:

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

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

        MyString s = s("Hello");
        

        如果您只想减慢应用程序的速度,您可以做很多事情,例如:

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

        【讨论】:

        • 这实际上将实例化一个“Hello”字符串并将其传递给 s 方法,这可能不是一针见血……
        • "Hello" 是一个文字,所以不是动态创建的。 OP 确实想要一个“最坏情况下的执行时间”;) 稍微调整过的最坏情况下的执行时间对我来说没有意义。
        • 我实际上希望能够计算出最坏情况下的执行时间。我只需要在循环上设置一个边界(这将限制字符串的长度,但这是另一回事)。我很确定 String 有使用循环的方法(等于 fx.)。但我会使用引导类路径来查看您的解决方案。
        猜你喜欢
        • 2013-03-06
        • 1970-01-01
        • 2021-12-24
        • 1970-01-01
        • 1970-01-01
        • 2016-02-11
        • 1970-01-01
        • 2016-10-24
        • 1970-01-01
        相关资源
        最近更新 更多