java - 像数据仓库一样预先计算额外的 Java 对象字段还是即时计算?

标签 java object pojo calculated-columns on-the-fly

由于我拥有数据仓库开发人员背景,因此我尝试思考是否应该预先计算派生值。我有 1000 个数字单列数据行。我把它们全部放在一个列表集合中。我必须计算附加字段并根据计算的字段相应地对该集合进行排序。那么您会使用 DataRowPrecalculated 还是 DataRow 作为 POJO?在数据仓库中预先计算列是有意义的,但我不确定它在 java 对象中是否有意义。下面是一些伪代码,但您应该明白了。使用场景2我有脏的forEach循环。似乎场景1使我的代码变得更容易,因为DataRowPrecalculated对象利用构造函数隐式调用setter来为每个数据行设置预计算字段。

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

最佳答案

我认为答案是视情况而定。

通过预先计算的路线,您需要预先做更多的工作,如果您有很多对象,这会减慢速度。此外,如果从未访问该值(对于所有对象),这可能会浪费精力。

通过将计算推迟到请求时间,您可以计算一次该值(如果尚未计算)并存储后续请求的答案。除非有特殊需要,否则我个人会倾向于第二种选择。如果您的应用程序不处理很大的负载,这可能并不重要,您可以选择您更喜欢的样式。

顺便说一句,您可能希望考虑这些是否是不可变的数据对象并将您的 setter 设置为私有(private)。

关于java - 像数据仓库一样预先计算额外的 Java 对象字段还是即时计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28694970/

相关文章:

java - 一个 POJO 但 XmlRootElement 名称不同

java - 创建 POJO 以匹配 JSON 结构

java - hibernate 到 POJO 生成器

java - 为类使用 static int 来识别对象对于 OO 来说是一个好的实践吗?

java - 从 Firestore 查询数据到 Arraylist 但一无所获?

java - Spring session 中带有 HeaderHttpSessionStrategy 的 Null HttpSessionManager

python - 如何将句子对象合并在一起?

java - 使用反射来使用特定的类构造函数并创建新对象

java - 根据Java中对象属性的最常见值过滤对象的Arraylist

javascript - 循环无限嵌套对象并构造字符串