Can I add new methods to the String class in Java?

后端 未结 15 2133
再見小時候
再見小時候 2020-11-27 06:36

I\'d like to add a method AddDefaultNamespace() to the String class in Java so that I can type \"myString\".AddDefaultNamespace() instead of

相关标签:
15条回答
  • 2020-11-27 07:12

    The Java String class is a final, making it immutable. This is for efficiency reasons and that it would be extremely difficult to logically extend without error; the implementers have therefore chosen to make it a final class meaning it cannot be extended with inheritance.

    The functionality you wish your class to support is not properly part of the regular responsibilities of a String as per the single responsibility principle, a namespace it is a different abstraction, it is more specialised. You should therefore define a new class, which includes String a member and supports the methods you need to provide the namespace management you require.

    Do not be afraid to add abstractions (classes) these are the essence of good OO design.

    Try using a class responsibility collaboration (CRC) card to clarify the abstraction you need.

    0 讨论(0)
  • 2020-11-27 07:15

    It is not possible, since String is a final class in Java.

    You could use a helper method all the time you want to prefix something. If you don't like that you could look into Groovy or Scala, JRuby or JPython both are languages for the JVM compatible with Java and which allow such extensions.

    0 讨论(0)
  • 2020-11-27 07:15

    Not possible, and that's a good thing. A String is a String. It's behaviour is defined, deviating from it would be evil. Also, it's marked final, meaning you couldn't subclass it even if you wanted to.

    0 讨论(0)
  • 2020-11-27 07:16

    YES!

    Based on your requirements (add a different namespace to a String and not use a derived class) you could use project Lombok to do just that and use functionality on a String like so:

    String i = "This is my String";
    i.numberOfCapitalCharacters(); // = 2
    

    Using Gradle and IntelliJ idea follow the steps below:

    1. Download the lombok plugin from intelliJ plugins repository.
    2. add lombok to dependencies in gradle like so: compileOnly 'org.projectlombok:lombok:1.16.20'
    3. go to "Settings > Build > Compiler > Annotation Processors" and enable annotation processing
    4. create a class with your extension functions and add a static method like this:

      public class Extension {
          public static String appendSize(String i){
              return i + " " + i.length();
          }
      }
      
    5. annotate the class where you want to use your method like this:

      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());
          }
      }
      

    Now you can use the method .appendSize() on any string in any class as long as you have annotated it and the produced result for the above example

    This is a String!

    would be:

    This is a String! 17

    0 讨论(0)
  • 2020-11-27 07:17

    As everyone else has noted, you are not allowed to extend String (due to final). However, if you are feeling really wild, you can modify String itself, place it in a jar, and prepend the bootclasspath with -Xbootclasspath/p:myString.jar to actually replace the built-in String class.

    For reasons I won't go into, I've actually done this before. You might be interested to know that even though you can replace the class, the intrinsic importance of String in every facet of Java means that it is use throughout the startup of the JVM and some changes will simply break the JVM. Adding new methods or constructors seems to be no problem. Adding new fields is very dicey - in particular adding Objects or arrays seems to break things although adding primitive fields seems to work.

    0 讨论(0)
  • 2020-11-27 07:17

    You can create your own version of String class and add a method :-)

    0 讨论(0)
提交回复
热议问题