Java中的copy()方法-这样的事情吗?

| 我遵循着名的IBM教程,该教程解析RSS feed。我测试了它,但只得到第一项的列表。在ѭ0中,我们可以看到currentMessage是最终的,这意味着它无法更改。当我编写自己的实现时,我从
currentMessage
中删除了
copy()
调用,因为编译器找不到此方法(因此,我认为这组数据)。
public class AndroidSaxFeedParser extends BaseFeedParser {

    public AndroidSaxFeedParser(String feedUrl) {
        super(feedUrl);
    }

    public List<Message> parse() {
        final Message currentMessage = new Message();
        RootElement root = new RootElement(\"rss\");
        final List<Message> messages = new ArrayList<Message>();
        Element channel = root.getChild(\"channel\");
        Element item = channel.getChild(ITEM);
        item.setEndElementListener(new EndElementListener(){
            public void end() {
                // Here, what\'s copy()?!!
                messages.add(currentMessage.copy()); 
            }
        });
        item.getChild(TITLE).setEndTextElementListener(new EndTextElementListener(){
            public void end(String body) {
                currentMessage.setTitle(body);
            }
        });
        item.getChild(LINK).setEndTextElementListener(new EndTextElementListener(){
            public void end(String body) {
                currentMessage.setLink(body);
            }
        });
        item.getChild(DESCRIPTION).setEndTextElementListener(new 
EndTextElementListener(){
            public void end(String body) {
                currentMessage.setDescription(body);
            }
        });
        item.getChild(PUB_DATE).setEndTextElementListener(new EndTextElementListener(){
            public void end(String body) {
                currentMessage.setDate(body);
            }
        });
        try {
            Xml.parse(this.getInputStream(), Xml.Encoding.UTF_8, 
root.getContentHandler());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return messages;
    }
}
所以我的问题是,ѭ1是多少,我在这里缺少重要的东西吗? 编辑 基本上,我想知道的是: ѭ1是什么?为什么它似乎适用于所有人,但不适用于我? (所有提到本教程的人都从没说过任何话。 另外,之所以将其定型是因为编译器要我这样做。如果删除
final
关键字,则会收到以下错误消息:   无法引用非最终变量   内部类中的currentMessage   用另一种方法来捍卫。 谢谢!     
已邀请:
“ 2”实例用作解析的邮件属性的累加器,当邮件解析完成时,当前邮件的副本将存储在列表中。当前消息本身不会通过复制更改,并且其属性将被以下消息的属性覆盖。没有
copy
,ѭ9列表最终将包含一遍又一遍相同的消息实例。 因此
copy
方法的行为应类似于
clone
,实际上清单中缺少该方法。     
  我们可以看到currentMessage是   最终意味着它是不可变的 这不是真的!将变量设置为final意味着无法将其重新分配,因此如果您要调用该变量,则该变量是不可变的。但是,除非它被设计为不可变的,否则它所指向的对象并不是不可变的! 您甚至可以从代码中看到:
final Message currentMessage = new Message();
您稍后将在代码中自行为其分配值,而编译器不会抱怨:
public void end(String body) {
    currentMessage.setTitle(body);
}
我的问题是,为什么您首先需要一条消息是不变的。仅当您有并发线程访问(和操作)数据时,不变性才是问题。在Feed解析器中不应发生这种情况,没有理由更改传入的消息。     

要回复问题请先登录注册