2015-02-24 59 views
1

由於我有一個數據倉庫開發人員背景,我試着讓我的頭腦是否應該預先計算派生值。我有1000個數字的一​​列數據行。我把它們都放在一個列表集合中。我必須計算額外的字段並根據計算字段對此集合進行相應的排序。那麼你會使用DataRowPrecalculated還是DataRow作爲POJO?預先計算數據倉庫中的列是有意義的,但我不確定它在java對象中是否有意義。以下是一些僞代碼,但你應該明白這一點。使用scenario2我有髒forEach循環。看起來,scenario1讓我的代碼變得更容易,因爲DataRowPrecalculated對象利用構造函數隱式地調用setter爲每個數據行設置預先計算的字段。按照數據倉庫的要求預先計算附加的Java對象字段,或者在運行中執行此操作?

public class DataRowPrecalculated { 

private int column1; 
private double precalculatedColumn1; 

public DataRowPrecalculated(int column1) { 
    this.column1 = column1; 
    setPrecalculatedColumn1(column1); 
} 

public int getColumn1() { 
    return column1; 
} 

public void setColumn1(int column1) { 
    this.column1 = column1; 
} 

public double getPrecalculatedColumn1() { 
    return precalculatedColumn1; 
} 

public void setPrecalculatedColumn1(int column1) { 
    this.precalculatedColumn1 = Math.sin(column1); 
} 

} 

public class DataRow { 

private int column1; 

public DataRow(int column1) { 
    this.column1 = column1; 
} 

public int getColumn1() { 
    return column1; 
} 

public void setColumn1(int column1) { 
    this.column1 = column1; 
} 

} 

public class Main{ 


public static void main(String[] args) { 
    scenario1(); 
    scenario2(); 
} 

private static void scenario1(){ 
    List<DataRowPrecalculated> drp = DAO.getDataRowPrecalculated(); 
    Collections.sort(drp, new Comparator<DataRowPrecalculated>() { 
     //implementation 
    }); 
} 

private static void scenario2(){ 
    List<DataRow> drp = DAO.getDataRow(); 
    Map<DataRow, Double> map = new HashMap<DataRow, Double>(); 
    for (DataRow dr : drp) { 
     double precalculatedColumnOnTheFly = Math.sin(drp.getColumn1()); 
     map.put(dr, new Double(precalculatedColumnOnTheFly)); 
    } 
    Collections.sort(map, new Comparator<DataRow>() { 
     //implementation 
    }); 
} 
} 

回答

2

我認爲答案是視情況而定。

通過進行預先計算的路線,您可以預先做更多的工作,如果您有很多物體,就會減慢速度。而且,如果從不訪問該值(對於所有對象),這可能是浪費精力。

通過將計算延遲到請求時間,如果尚未計算出來,可以計算一次值,併爲後續請求存儲答案。除非有特定的需求,否則我自己的偏好會導致第二種選擇。如果您的應用程序無法處理重要的負載,則可能無關緊要,您可以選擇更適合自己的風格。

另外,您可能希望考慮這些是不可變的數據對象,並使您的setter變爲私有。

+0

是的,肯定會去私人制定者 – inzzz 2015-02-24 12:42:20

相關問題