【问题标题】:Define own XMLEventReader to implement the Closeable interface定义自己的 XMLEventReader 来实现 Closeable 接口
【发布时间】:2023-03-26 11:08:01
【问题描述】:

我想将 try-with-resources 与 XMLEventReader 一起使用。

我发现,XMLEventReader 只是一个接口,而我从XMLInputFactory.newInstance().createXMLEventReader(stream) 获得的对象属于com.sun.xml.internal.stream.XMLEventReaderImpl 类。

通常我会扩展该类以实现Closeable。但我无法访问它(我无法在我的 IDE 中打开它)。
我在网上找到了它的代码。但我不愿意把它复制到一个新的类中,只是为了让它可以关闭。

那么为什么我不能访问该课程?创建Closeable XMLEventReader 的最佳解决方案是什么?

【问题讨论】:

    标签: java interface autocloseable


    【解决方案1】:

    这个怎么样:

    public class CloseableXmlEventReader implements XMLEventReader, AutoCloseable{
    
        private final XMLEventReader internal;
    
        public CloseableXmlEventReader(XMLEventReader internal) {
            this.internal = internal;
        }
    
        @Override
        public XMLEvent nextEvent() throws XMLStreamException {
            return internal.nextEvent();
        }
    
        @Override
        public boolean hasNext() {
            return internal.hasNext();
        }
    
        @Override
        public XMLEvent peek() throws XMLStreamException {
            return internal.peek();
        }
    
        @Override
        public String getElementText() throws XMLStreamException {
            return internal.getElementText();
        }
    
        @Override
        public XMLEvent nextTag() throws XMLStreamException {
            return internal.nextTag();
        }
    
        @Override
        public Object getProperty(String name) throws IllegalArgumentException {
            return internal.getProperty(name);
        }
    
        @Override
        public void close() throws XMLStreamException {
            internal.close();
        }
    
        @Override
        public Object next() {
            return internal.next();
        }
    }
    

    这样使用:

    try(CloseableXmlEventReader reader = 
            new CloseableXmlEventReader(XMLInputFactory.newInstance().createXMLEventReader(new FileInputStream("test.xml")))) {
    
    } catch (XMLStreamException | FileNotFoundException ex) {
        Logger.getLogger(CloseableXmlEventReader.class.getName()).log(Level.SEVERE, null, ex);
    }
    

    【讨论】:

    • 好的,那行得通。但这不是我更喜欢的解决方案。因为如果XMLEventReader 接口/XMLEventReaderImpl 类发生变化,我必须将这些变化适应我的CloseableXmlEventReader 类(例如添加/删除方法时)。
    • 我认为更改 XMLEventReader 的界面是极不可能的。我从来没有从标准库中实现过接口,后来让他们添加/删除了一个破坏我实现的函数。如果您使用的功能被删除或接口添加了更多必需的功能,您真的不能使用任何类或实现任何接口并且不会让您的代码中断。即使它发生了,修复也很容易,只需另一个单行函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 2012-10-19
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 2020-04-17
    相关资源
    最近更新 更多