[英]How to return a variable from ananymous inner class located inside a method
我想从一个方法中指定的匿名类返回一个字符串。我想从方法parseXml返回respMessage。 我不知道如何做到这一点,我不能把它作为一个类变量。 请告诉我如何退货? 我也无法使其成为最终因为必须分配本地最终变量而无法重新分配。
private String parseXml(String resXml) {
logger.info("In sax parsing");
//final String respMessage;
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
boolean isResMessage = false;
protected String respMessage;
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("ErrorMessage")) {
isResMessage = true;
}
}
public void characters(char ch[], int start, int length) throws SAXException {
if (isResMessage) {
respMessage = new String(ch, start, length);
isResMessage = false;
}
}
public String getRespMessage() {
return this.respMessage;
}
};
saxParser.parse(new InputSource(new StringReader(resXml)), handler);
} catch (Exception e) {
e.printStackTrace();
}
return this.DefaultHandler().getRespMessage();
}
在匿名类中,您不能使用封闭方法中的非最终局部变量。 但是有一个众所周知的技巧:使用一个元素的最终数组,你的匿名类可以修改元素:
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
final String[] result = new String[1];
DefaultHandler handler = new DefaultHandler() {
void someMethod() {
result[0] = ...;
}
...
};
...
return result[0];
}
最简单的解决方案是创建一个合适的类,或者至少定义一个本地类 :
try {
...
class Handler extends DefaultHandler {
...
}
Handler handler = new Handler();
saxParser.parse(new InputSource(new StringReader(resXml)), handler);
return handler.getRespMessage();
} catch (Exception e) {
...
return null;
}
或者,您可以在类之外使用可变引用,例如StringBuilder
:
private String parseXml(String resXml) {
final StringBuilder respMessage = new StringBuilder();
try {
...
DefaultHandler handler = new DefaultHandler() {
...
respMessage.append(new String(ch, start, length);
...
}
saxParser.parse(new InputSource(new StringReader(resXml)), handler);
}
...
return respMessage.toString();
}
最后,最讨厌的解决方案是在初始化程序中调用parse()
方法并在同一表达式中返回结果:
return new DefaultHandler() {
{
saxParser.parse(new InputSource(new StringReader(resXml)), this);
}
...
}.getRespMessage();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.