我可以在Java中向String类添加新方法吗?

use*_*546 23 java string

我想在Java中的String类中添加一个方法AddDefaultNamespace(),这样我就可以输入"myString".AddDefaultNamespace()而不是DEFAULTNAMESPACE +"myString",以获得类似"MyDefaultNameSpace.myString"的内容.我不想添加另一个派生类(例如PrefixedString).

也许这种方法对你不好,但我个人讨厌使用"+".但是,无论如何,是否可以在Java中向String类添加新方法?

感谢致敬.

Gus*_*ind 62

String 是一个最终类,这意味着它无法扩展到您自己的实现.


小智 24

嗯,实际上每个人都缺乏想象力.我需要编写自己的startsWith方法版本,因为我需要一个不区分大小写的方法.

class MyString{
    public String str;
    public MyString(String str){
        this.str = str;
    }
    // Your methods.
}
Run Code Online (Sandbox Code Playgroud)

然后它很简单,你就像这样制作你的String:

MyString StringOne = new MyString("Stringy stuff");
Run Code Online (Sandbox Code Playgroud)

当你需要在String库中调用一个方法时,这样做很简单:

StringOne.str.equals("");
Run Code Online (Sandbox Code Playgroud)

或类似的东西,你有它...扩展String类.

  • 开箱即用=). (2认同)

Ale*_*ler 17

正如其他人都注意到的那样,你不允许扩展String(由于最终).但是,如果您感觉非常疯狂,可以修改String本身,将其放在jar中,并在-cbootclasspath/p:myString.jar之前添加bootclasspath以实际替换内置的String类.

由于我不会进入的原因,我实际上已经这样做了.您可能有兴趣知道即使您可以替换类,但是String在Java的每个方面的内在重要性意味着它在整个JVM启动过程中使用,并且一些更改将简单地破坏JVM.添加新方法或构造函数似乎没有问题.添加新字段非常冒险 - 特别是添加对象或数组似乎会破坏事情,尽管添加原始字段似乎有效.


jru*_*lph 6

这是不可能的,因为String是Java中的最终类.

您可以一直使用辅助方法为前缀添加前缀.如果您不喜欢它,您可以查看Groovy或Scala,JRuby或JPython都是与Java兼容的JVM语言,并允许这样的扩展.


Pau*_*ulB 5

是的!

根据您的要求(向字符串添加不同的命名空间而不使用派生类),您可以使用项目 Lombok 来执行此操作并在字符串上使用功能,如下所示:

String i = "This is my String";
i.numberOfCapitalCharacters(); // = 2
Run Code Online (Sandbox Code Playgroud)

使用 Gradle 和 IntelliJ idea 请按照以下步骤操作:

  1. 从 intelliJ 插件存储库下载 lombok 插件。
  2. 将 lombok 添加到 gradle 中的依赖项,如下所示:compileOnly 'org.projectlombok:lombok:1.16.20'
  3. 转到"Settings > Build > Compiler > Annotation Processors"并启用注释处理
  4. 使用扩展函数创建一个类并添加一个静态方法,如下所示:

    public class Extension {
        public static String appendSize(String i){
            return i + " " + i.length();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 注释您要在其中使用方法的类,如下所示:

    import lombok.experimental.ExtensionMethod;
    
    @ExtensionMethod({Extension.class})
    public class Main {
        public static void main(String[] args) {
            String i = "This is a String!";
            System.out.println(i.appendSize());
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

现在,您可以在任何类中的任何字符串上使用该方法.appendSize(),只要您已对其进行注释以及上面示例的生成结果即可

这是一个字符串!

将会:

这是一个字符串!17 号