2015-02-24 4 views
1

Поскольку у меня есть база разработчиков для хранилища данных, я пытаюсь понять, следует ли предварительно вычислять производные значения. У меня 1000 рядов данных с одним столбцом. Я помещал их в список. Я должен вычислить дополнительное поле и сортировать эту коллекцию на основе вычисленного поля соответственно. Так вы бы использовали DataRowPrecalculated или DataRow как POJO? Имеет смысл предварительно просчитать столбцы в хранилище данных, но я не уверен, имеет ли смысл в java-объектах. Ниже приведен вид псевдокода, но вы должны получить эту идею. Использование сценария2 У меня есть грязный цикл forEach. Похоже, что сценарий1 делает мой код намного проще, потому что объект 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

Я думаю, что ответ зависит.

Переходя по заранее рассчитанному маршруту, вы делаете больше работы, которая замедлит работу, если у вас много объектов. Кроме того, это может быть потрачено впустую, если значение никогда не доступно (для всех объектов).

Отложив вычисление на запрос времени, вы можете рассчитать значение один раз, если оно еще не рассчитано, и сохранить ответ для последующих запросов. Если нет конкретной потребности, мое собственное предпочтение будет ошибочно относиться ко второму варианту. Если вы не используете значительную нагрузку, это, вероятно, не имеет значения, и вы можете выбрать стиль, с которым вам удобнее.

В качестве альтернативы вы можете рассмотреть вопрос о том, являются ли эти объекты неизменяемыми данными и делают ваши сеттеры частными.

+0

Да, определенно пойдет для частных сеттеров – inzzz

 Смежные вопросы

  • Нет связанных вопросов^_^