BlackBerry中的'+'字符串运算符和StringBuilder

R4j*_*R4j 0 java stringbuilder blackberry

我有BlackBerry JDE 6.0的问题以下代码给我警告(并在运行时导致错误)

 String s = "hello";
 doSomeStuff(s + "world");
Run Code Online (Sandbox Code Playgroud)

警告:

Warning!: Reference to undefined class: java.lang.StringBuilder
Run Code Online (Sandbox Code Playgroud)

我不使用任何StringBuilder.我搜索并发现最新版本的RIM API不包含StringBuilder类.
将JRE版本更改为1.4可能有所帮助,但它给我带来了很大麻烦,因为我无法在此版本中使用泛型集合和一些新的api.
另一种解决方案是我可以使用StringBuffer,但我不能简单地使用'+'运算符吗?为什么难以尝试?
更新:
我正在寻找另一种使用'+'运算符的方法,因为我的代码使用了很多,我不想花很多时间来替换所有这些.

Mic*_*hue 5

Java编译器将使用一系列字符串连接自动转换任何表达式以使用缓冲区.在Java 1.5之前,只有一个选择 - StringBuffer.然而,它在早期的Java中遇到了同步所有公共方法的惯例.在Java 1.5中添加了一个新的缓冲区类 - StringBuilder - 它更好,因为它会丢弃同步,让它由类的用户来正确地同步访问.当Java编译器以Java 1.5或更高版本为目标时,它将使用StringBuilder.对于1.5之前的版本,它将使用StringBuffer.

BlackBerry设备使用基于Java 1.3的Java-ME,因此不存在StringBuilder类.您的问题是您正在编写现代Java-SE代码并希望将其部署在Java-ME BlackBerry设备上.如果您使用的是Eclipse,请将Java语言合规性级别更改为1.3.这将使编译器正确生成StringBuffer引用.它还将使用泛型语法错误.这是BlackBerry开发的预期 - 你没有得到泛型.

示例代码:

public class test {
    public static String concat(String a, String b) {
        return a + b;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译时的字节码结果 javac -source 1.5 -target 1.5 test.java

public static java.lang.String concat(java.lang.String, java.lang.String);
  Code:
   0:   new     #2; //class java/lang/StringBuilder
   3:   dup
   4:   invokespecial   #3; //Method java/lang/StringBuilder."<init>":()V
   7:   aload_0
   8:   invokevirtual   #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   11:  aload_1
   12:  invokevirtual   #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   15:  invokevirtual   #5; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   18:  areturn
Run Code Online (Sandbox Code Playgroud)

编译时的字节码结果 javac -source 1.3 -target 1.3 test.java

public static java.lang.String concat(java.lang.String, java.lang.String);
  Code:
   0:   new     #2; //class java/lang/StringBuffer
   3:   dup
   4:   invokespecial   #3; //Method java/lang/StringBuffer."<init>":()V
   7:   aload_0
   8:   invokevirtual   #4; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;
   11:  aload_1
   12:  invokevirtual   #4; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;
   15:  invokevirtual   #5; //Method java/lang/StringBuffer.toString:()Ljava/lang/String;
   18:  areturn
Run Code Online (Sandbox Code Playgroud)