2015-02-24 53 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

相关问题