java - BlackBerry 中的“+”字符串运算符和 StringBuilder

标签 java blackberry stringbuilder

我在使用 BlackBerry JDE 6.0 时遇到问题以下代码向我发出警告(并在运行时导致错误)

 String s = "hello";
 doSomeStuff(s + "world");

警告:

Warning!: Reference to undefined class: java.lang.StringBuilder

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

最佳答案

Java 编译器会自动将任何具有一系列字符串连接的表达式转换为使用缓冲区。在Java 1.5之前,只有一种选择——StringBuffer。然而,它受到早期 Java 同步所有公共(public)方法的约定的影响。在 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;
    }
}

使用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

使用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

关于java - BlackBerry 中的“+”字符串运算符和 StringBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11112786/

相关文章:

java - JTabbedPane - 在选项卡周围设置默认边框..?

java - 请告诉我何时在 java 中使用 getInstance() 方法。

user-interface - 如何在黑莓中为屏幕创建固定背景?

java - 在java中使用字节

java - 使用 READ BINARY 读取超过 256 个字节

java - StringBuilder.append() 是否应该始终优先于串联?

c# - 当在 stringbuilder 上调用append时,我们是否将字符串添加到堆中?

c# - 使用多线程访问相同的字符串(StringBuilder)

java - Android 水平轮(自定义)DatePicker 中的问题

android - 在iPhone,BlackBerry和Android网站上使用声音