2016-06-12 123 views
-3

以下方法讀取文件並返回某個List類型。如何避免Java中List方法中的代碼重複?

List<X> readFile(String file) { 
    List<X> x = new ArrayList<X>(); 

    File f = new File(file); 

    List<String> lines = null; 
    try { 
     lines = Files.readLines(f, Charsets.UTF_8); 
    } catch (IOException e) { 
    } 

    List<X> xList = new ArrayList<X>(); 
    for (String line : lines) { 
     xList.add(new X(line)); 
    } 

    return xList; 
} 

現在需要不同的列表。該方法已被複制,並且以下返回不同的List類型。

List<Y> readFile(String file) { 
    List<Y> y = new ArrayList<Y>(); 

    List<String> lines = null; 
    try { 
     lines = Files.readLines(f, Charsets.UTF_8); 
    } catch (IOException e) { 
    } 

    List<Y> yList = new ArrayList<Y>(); 
    for (String line : lines) { 
     yList.add(new Y(line)); 
    } 

    return yList; 
} 

問題是該類已被複制。在這種情況下如何避免代碼重複?

嘗試

avoidDuplicatedCode(){ 
    List<Y> y = new ArrayList<Y>(); 

    List<String> lines = null; 
    try { 
     lines = Files.readLines(f, Charsets.UTF_8); 
    } catch (IOException e) { 
    } 

    return y 
} 

結果:

  • 一套方法的返回類型爲 '列表'

時改變了很多其他問題發生

+0

如果你不對它們做任何事情,閱讀文件的所有行是什麼意思?這些方法的**實際**代碼是什麼?如此,您可以用'new ArrayList ()'替換第一個,用'new ArrayList ()'替換第二個。 –

+0

如果你不關心'lines'列表,閱讀文件有什麼意義?關於你的問題:傳遞從「String」轉換爲「X」或「Y」的「東西」,那麼你只需要一種通用方法。 – Tom

+0

我忘了添加代碼的缺失部分,即將行添加到列表中的部分。 – 030

回答

2

你可以引入泛型p參數:

<T> List<T> readFile(String file) { 
    List<T> list = new ArrayList<T>(); 
    // ... 
    return list; 
} 

public void foo() { 
    List<Integer> l1 = readFile("l1"); 
    List<String> l2 = readFile("l2"); 
} 
+0

謝謝你解釋。我的另一個問題是在課堂中創建一個新的對象。這可能是通用的('xList.add(new X(line));'''yList.add(new Y(line));')? – 030

+0

@Alfred,由於擦除你不能輕易做到,泛型類型在運行時不可用。但是有一些解決方法,例如,您可以傳遞一個創建T作爲附加參數的函數 – SerCe