扩展java.lang.String

Dar*_*n L 30 java string inheritance

java.lang.String被声明为final,但有没有任何合法的机制或以其他方式扩展它并替换equals(String other)方法?

Jon*_*eet 28

不,绝对不是.如果您想要一些"其他"类型的字符串,请创建另一个可能包含字符串的类型:

public final class OtherString {
    private final String underlyingString;

    public OtherString(String underlyingString) {
        this.underlyingString = underlyingString;
    }        

    // Override equals however you want here
}
Run Code Online (Sandbox Code Playgroud)

  • 但是**String s ="hi";**是可行的,但不是**OtherString s ="hi";** (12认同)
  • @everlasto:好的.你必须写`OtherString s = new OtherString("hi");` (2认同)
  • @marlonpya:不会比您创建的任何其他类多多少少。 (2认同)
  • @JonSkeet在我看来,使字符串不可变(“私有最终字节[]值;”java.lang.String:140)与使字符串不可扩展(“公共最终类字符串”java.lang.字符串:125)。仅仅因为有人想出了一种方法并不意味着它是唯一的方法。 (2认同)
  • @DavidUrry:再说一遍,这不是我想要的 - 因为我想要保证实际的不变性,而不仅仅是“字符串暴露的位的不变性”。它可能对你有用,但我个人很高兴“String”是最终的。 (2认同)

Sti*_*itt 20

我猜你最接近的是制作一些实现CharSequence的类.大多数JDK字符串操作方法都接受CharSequence.例如StringBuilder.结合toString()的良好实现,String和valueOf()的各种方法,你可以非常接近自然的替代品.


Tob*_*obi 6

现在,有办法了。通过manifold,可以扩展每个Java 类。这是字符串的示例:

package extensions.java.lang.String;

import manifold.ext.api.*;

@Extension
public class MyStringExtension {

  public static void print(@This String thiz) {
    System.out.println(thiz);
  }

  @Extension
  public static String lineSeparator() {
    return System.lineSeparator();
  }
}
Run Code Online (Sandbox Code Playgroud)

可以按如下方式使用:

String name = "Manifold";
name.print();
String.lineSeparator();
Run Code Online (Sandbox Code Playgroud)

另一个例子可以在这里找到:https ://jaxenter.com/manifold-code-generator-part-2-151762.html

请注意,该流形仍然是 alpha。