Java中的copy()方法-有类似的东西吗?

Java中的copy()方法-有类似的东西吗?,java,rss,copy,immutability,final,Java,Rss,Copy,Immutability,Final,我正在关注著名的RSS提要解析。我对它进行了测试,只得到了第一项的列表。在AndroidSaxFeedParser中,我们可以看到currentMessage是final,这意味着它不能更改,当我编写自己的实现时,我从currentMessage中删除了copy()调用,因为编译器没有找到此方法(因此我认为是复制的数据集) 公共类AndroidSaxFeedParser扩展了BaseFeedParser{ 公共AndroidSaxFeedParser(字符串feedUrl){ 超级(feedUr

我正在关注著名的RSS提要解析。我对它进行了测试,只得到了第一项的列表。在
AndroidSaxFeedParser
中,我们可以看到currentMessage是final,这意味着它不能更改,当我编写自己的实现时,我从
currentMessage
中删除了
copy()
调用,因为编译器没有找到此方法(因此我认为是复制的数据集)

公共类AndroidSaxFeedParser扩展了BaseFeedParser{
公共AndroidSaxFeedParser(字符串feedUrl){
超级(feedUrl);
}
公共列表解析(){
最终消息currentMessage=新消息();
RootElement root=新的RootElement(“rss”);
最终列表消息=新建ArrayList();
元素通道=root.getChild(“通道”);
元素项=channel.getChild(项);
item.setEndElementListener(新的EndElementListener(){
公共无效结束(){
//这里,什么是copy()?!!
messages.add(currentMessage.copy());
}
});
item.getChild(TITLE.setEndTextElementListener(新的EndTextElementListener()){
公共无效结束(字符串体){
currentMessage.setTitle(正文);
}
});
item.getChild(LINK.setEndTextElementListener(新的EndTextElementListener()){
公共无效结束(字符串体){
currentMessage.setLink(正文);
}
});
item.getChild(说明).setEndTextElementListener(新建
EndTextElementListener(){
公共无效结束(字符串体){
currentMessage.setDescription(正文);
}
});
item.getChild(发布日期).setEndTextElementListener(新的EndTextElementListener(){
公共无效结束(字符串体){
currentMessage.setDate(正文);
}
});
试一试{
parse(this.getInputStream(),Xml.Encoding.UTF_8,
root.getContentHandler());
}捕获(例外e){
抛出新的运行时异常(e);
}
返回消息;
}
}
所以我的问题是,什么是
copy()
,我是否遗漏了一些重要的东西

编辑 基本上,我想知道的是:

  • 什么是
    copy()
    ?为什么它似乎对每个人都有效,但对我无效?(所有提到教程的人都没有提到过它。)
另外,我之所以要把它定为最终版本,是因为编译器要求我这么做。如果删除
final
关键字,则会收到以下错误消息:

无法引用非最终变量 内部类中的currentMessage 用另一种方法定义

谢谢

我们可以看到当前消息是 最后,这意味着它是不可变的

那不是真的!将变量设为final意味着它不能被重新分配,因此如果您想这样调用它,那么该变量是不可变的。但是它指向的对象不是不可变的,除非它被设计成不可变的

您甚至可以从代码中看到:

final Message currentMessage = new Message();
您自己在代码的后面为它赋值,编译器不会抱怨:

public void end(String body) {
    currentMessage.setTitle(body);
}

我的问题是为什么你首先需要一条信息是不变的。只有当您有并发线程访问(和操作)数据时,不变性才是一个问题。这不应该发生在提要解析器中,没有理由更改传入消息。

currentMessage
实例用作已解析消息属性的累加器,当消息完成解析时,当前消息的副本存储在列表中。通过复制,当前消息本身保持不变,其属性将被以下消息的属性覆盖。如果没有
副本
消息
列表最终将反复包含相同的消息实例


因此,
copy
方法的行为应该类似于
clone
,实际上,该方法在列表中缺失了。

您的要求不太清楚,但将某个内容声明为
final
并不能使其不变。我假设它与clone()的行为相同。是的,我也考虑过它。但是为什么在教程中提到它呢?我尝试了所有的JRE版本,但总是出错。我正在编辑这个问题以使其更清楚。只是想一想:是否Android SDK在隐式扩展的
对象
超类中有一个
copy
方法,而通常的SDK有
clone
方法?好的,感谢您对“不可变”术语的澄清。我编辑了我的问题,以解释为什么我首先添加final关键字。@Amokrane是的,我只是想添加:这里使用final的原因是变量是在您猜对的内部类中访问的。我实现了
Cloneable
接口,它工作得很好。可能作者的真正意思是
clone()
(我想是的,因为我正在编写一个Android应用程序,所以Android SDK也没有
copy()
方法)。在这种情况下,我应该给他发一封电子邮件,和他核实一下。
public void end(String body) {
    currentMessage.setTitle(body);
}