gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:30:53 24 4
gpt4 key购买 nike

我在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com