繁体   English   中英

如何从位于方法内的ananymous内部类返回变量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM