0
<%RemovableStorageEventListener listener = new RemovableStorageEventListener() { 
public void inserted(Storage storage) {%>
    enableButton();
<%} 
public void removed(Storage storage) {%>
    disableButton();
<%} }; 

BundleContext bc = AppManager.getInstance().getBundleContext();
StorageManager sm = StorageManager.getInstance(KSFUtility.getInstance().getApplicationContext(bc));
sm.addListener(listener);
%>

我在 Start_jsp.java 中收到错误

out.write("\n\t\tenableButton();\n\t"); 和 out.write("\n\t\tdisableButton();\n\t");

RemovableStorageEventListener listener = new RemovableStorageEventListener() { 
public void inserted(Storage storage) {
  out.write("\n\t\tenableButton();\n\t");
} 
public void removed(Storage storage) {
  out.write("\n\t\tdisableButton();\n\t");
} }; 

BundleContext bc = AppManager.getInstance().getBundleContext();
StorageManager sm = StorageManager.getInstance(KSFUtility.getInstance().getApplicationContext(bc));
sm.addListener(listener);

这是我的 javascript

function enableButton(){
document.getElementById('scan').disabled=false;
}

function disableButton(){
document.getElementById('scan').disabled=true;
}
4

1 回答 1

0

您必须创建out变量final,否则您将无法在anonymous类中访问它(在您的情况下,在 的实现中RemovableStorageEventListener

Java 不支持真正的闭包(Java 8 应该支持它们),即使使用像您在这里使用的匿名类(newRemovableStorageEventListener() { ... }`)看起来像一种闭包。

变量out是局部变量。您使用匿名类创建的对象可能会持续到保存out变量的块完成之后。当它完成时,变量 ( out) 将从堆栈中清除,因此它不再存在。同时,匿名类对象引用该变量。如果匿名类对象在清理完变量后尝试访问该变量,事情就会变得非常糟糕。

通过制作它final,它不再是真正的变量,而是一个常数。

于 2013-06-28T10:01:46.613 回答