在编译模式下。
String s1 = null;
String s2 = null;
s2 = s1 + s2;
Window.alert("null + null = " + s2);
结果:
"null + null = nullnull"
但这段代码:
public String getValue(DocListsInfo object) {
String s1 = object.getUrlForApplication();
Window.alert("2: " + s1);
String s2 = object.getEodLink();
Window.alert("3: " + s2);
String s3 = s1 + s2;
Window.alert("4: " + s3);
return s3;
}
=>
// compiled javascript:
function NUb(a){var b,c,d;b=a.q;$wnd.alert('2: '+b);c=a.g;$wnd.alert('3: '+c);d=b+c;$wnd.alert('4: '+d);return d}
如果两个getter都返回null,则返回0。
答案 0 :(得分:1)
我对GWT编译器内部工作原理的了解非常有限,但我想我可能知道发生了什么。
首先,两个片段之间的区别是什么?关于第一个的每个细节在编译时都是已知的(String
都是null
),而我们对第二个不太了解。
现在,Java中的null + null
是什么? nullnull
可以阅读here。
然而,JavaScript中的null + null
是什么?它是0
,因为您只需在浏览器中进行测试即可。
现在我的想法如下:让我们从您的第二个代码段开始。它被编译为JavaScript,然后JavaScript将根据s1
确定s2
和object
的内容。然后它会尝试添加/连接它们,结果是0
。嗯,没关系,因为这是你在使用JavaScript时所期望的(好吧,如果你只是了解Java,那就不那么了)。
第一个代码片段(这是我的猜测)似乎是通过编译器的前/后处理步骤进行优化的(因为我们已经知道它们都是null
)。因此,JavaScript看到的所有内容(编译器产生的内容)都是常量。
也许其他人可以对我猜想的步骤有所了解。