克隆一个marc4j记录类

时间:2017-06-15 23:56:07

标签: java

我正在尝试从Java marc4j克隆一个Recrod类 与

private Record copyRecord(Record record) {
     Record f = new Record();
     f.set(record.get());
     return f;
}

但是我得到了一个java.lang.RuntimeException:错误:org.marc4j.marc.Record是抽象的;无法实例化 在线 f.set(record.get());

请记住我的java技能有限, 所以问题是

如何获得原始类的克隆,我可以操作并更改其值而不会弄乱原始的类数据和方法?

提前致谢 问候, 哈利

3 个答案:

答案 0 :(得分:1)

您无法实例化Record,因为它是一个界面。

如果您想要复制Record,可以使用MarcStreamWriterMarcStreamReader,但这似乎超出了顶部:

public Record copyRecord(Record r)
{
    ByteArrayOutputStream boas = new ByteArrayOutputStream();
    MarcStreamWriter mw = new MarcStreamWriter(boas);
    mw.write(r);

    byte[] ba = boas.toByteArray();
    ByteArrayInputStream bois = new ByteArrayInputStream(ba);
    MarcStreamReader mr = new MarcStreamReader(bois);
    Record r2 = null;
    if(mr.hasNext())
        r2 = mr.next();
    return r2;
}

您可能需要在此处理一些例外情况,并关闭作家/读者。

答案 1 :(得分:0)

这里有一些定义。首先,类Record必须具有适当的方法。基于此documentation,我们没有方法:set()get()

例如,假设我们有一个班级Record

public class Record{
...
    public Record get(){
      ...
      return rc;
    }

    public void set(Record r){
      ...
    }
}

现在,您的代码将起作用:

private Record copyRecord(Record record) {
     Record f = new Record();
     f.set(record.get());
     return f;
}

要克隆(制作新实例)您需要的课程:

...
Record rd1 = new Record(); //To make a new instance
Record rd2 = new Record(); // To make a new instance
...

现在,当你这样做时:

rd1 = rd2; //You will relate this two references (variables) to the single object

现在,当您自动更改rd1时,您将更改rd2,反之亦然。

答案 2 :(得分:0)

我认为您应该使用MarcFactory。添加领导者。添加VariableFields。如果我是正确的,那应该是完整的。

private static Record cloneRecord(Record record)
{
    Record outputRecord = MarcFactory.newInstance().newRecord();
    outputRecord.setLeader(record.getLeader());
    for(VariableField variableField : record.getVariableFields())
    {
        outputRecord.addVariableField(variableField);
    }

    return outputRecord;
}