【问题标题】:Design data class in Java用Java设计数据类
【发布时间】:2017-07-25 14:39:49
【问题描述】:

我研究了一下,我不确定。

我有一个需要返回一堆数据的进程。我将数据放在一个 Result 类中:

public final class Result implements Serializable {
/** Inmmutable class
     * 
     */
    private static final long serialVersionUID = -916675731077365794L;

    private final String nick;
    private final LocalDateTime date_init;
    private final LocalDateTime date_end;

    private final double profit;
    private final double tax;

    private final Double balance;

    private final int inputs;

    private final List<CustomObjects> inputs_by_month;

    // Keep going...

    // constructor

    Results(String nick, LocalDateTime date_init, LocalDateTime date_end,
            double profit, double tax/* Keep going... */) {
        super();
        this.nick = nick;
        this.date_init = date_init;
        this.date_end = date_end;
        this.profit = profit;
        this.tax = tax;
        /* Keep going... */
    }

    /* getters here */
}

我不确定如何创建这个对象。是的,我可以使用工厂类

public final class ResultFactory {

    private String nick;
    private LocalDateTime date_init;
    private LocalDateTime date_end;

    private double profit;
    private double tax;

    private Double balance;

    private int inputs;

    private List<CustomObjects> inputs_by_month;

    // Keep going...

    public Result getResult()
    {
       return Result(nick,date_init,date_end,/*...*/);
    }

    public void setNick(String nick)
    {
        this.nick = nick;
    }

    public void setDateInit(LocalDateTime date_init){
        this.date_init = date_init;
    }

    /* ... */
}

但我正在复制整个结构。看起来不太对。

我正在寻找一种在不可变类中存储数据的模式。

【问题讨论】:

  • 如果你总是直接使用Result构造函数呢?我认为您应该将该类拆分为更多类,并将这些类作为属性添加到Result
  • 您使用的是 Builder 而不是 Factory,这很好,这就是您应该使用 Builder 的方式,只是我不应该持有任何逻辑
  • @alayor 我把我的过程分成不同的子类,每个类收集不同的数据。

标签: java design-patterns serialization store


【解决方案1】:

您可以做的是将您的 Result 类拆分为更多类。

public class Result {
  private final String nick;
  private final LocalDateTime date_init;
  private final LocalDateTime date_end;
  private final MonetaryResult monetaryResult;
  private final InputsResult inputsResult;

   Results(String nick, LocalDateTime date_init, LocalDateTime date_end, MonetaryResult monetaryResult, InputsResult inputsResult) {
        ...
        this.monetaryResult = monetaryResult;
        this.inputsResult = inputsResult;
        ...
    } 
}

这样,您可以避免一个具有许多属性的类,从而使其构造变得困难。

你可以像这样构造你的结果对象。

new Restult(
 "nick",
  createDate(),
  createDate(),
  new MonetaryResult(...),
  ...
)

【讨论】:

    【解决方案2】:

    您可以使用 Lombok @Value@Builder 注释:

    @Builder
    @Value
    public final class Result implements Serializable {
        String nick;
        LocalDateTime date_init;
        LocalDateTime date_end;
        double profit;
        double tax;
        Double balance;
        int inputs;
        List<CustomObjects> inputs_by_month;
        // Keep going...
    }
    

    Lombok 将为您生成:

    • private final字段关键字
    • 构造函数
    • toStringequalshashCode 方法
    • builder(然后你可以使用Result.builder().nick("foo").build()构建你的对象)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-22
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 2015-12-23
      相关资源
      最近更新 更多