2017-06-15 100 views
2

我試圖克隆從Java marc4j 一個Recrod類克隆一個marc4j記錄類

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

但是我得到一個了java.lang.RuntimeException:出現錯誤:org.marc4j.marc.Record是抽象的;無法實例化 on line f.set(record.get());

請記住,我的Java技能有限, 所以問題是

我怎樣才能得到我可以操縱和改變其值,不會對原有類數據亂搞原始類的克隆和方法?

在此先感謝 問候, 哈利

回答

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,反之亦然。

+0

我不認爲他們可以控制,因爲「Record」是marc4j庫的一部分 –

+0

是的,你說得對,但是使用這個文檔我們沒有它:http://projects.freelibrary.info/ freelib-marc4j/apidocs/org/marc4j/marc/class-use/Record.html –

+0

從文檔看來,我們可以使用: RawRecord.getAsRecord(boolean permissive,boolean toUtf8,String combinePartials,String defaultEncoding) –

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; 
} 

您可能需要採取一些例外的照顧這裏也關閉作家/讀者。

+0

是的,你說得對,我要檢查它的未來。謝謝 –