【问题标题】:Is it wise to store properties of a class in an ArrayList rather than using fields?将类的属性存储在 ArrayList 中而不是使用字段是否明智?
【发布时间】:2015-11-18 00:33:47
【问题描述】:

我能否将来自不同文本字段的文本存储在 ArrayList 中,并将其存储到 Booking 类中的 Customer 属性中。现在它正在读取每个文本字段并将它们保存到不同的属性中。

private String flighttime;
private String flightlocation;
private String flightfee;
private boolean car;
private boolean insurance;
private Customer customer;

private void savebookingButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                  
        Booking customerbooking = new Booking();
        Customer cust = null;

        try {
            if (custnameTF.getText().equals("")) {
                throw new EmptyField("Please Insert Customer");
            } else {
                FileOutputStream fos = new FileOutputStream("Bookings/" + custidTF.getText() + ".txt");
                ObjectOutputStream oos = new ObjectOutputStream(fos);

                cust.setPersonName((custnameTF.getText()));
                cust.setPersonSurname((custsurnameTF.getText()));
                cust.setPersonID((custidTF.getText()));
                cust.setConsultantname(consnameTF.getText());
                cust.setConsultantsurname((conssurnameTF.getText()));
                cust.setConsulid(considTF.getText());
                customerbooking.setFlightlocation(locationCB.getSelectedItem().toString());
                customerbooking.setFlighttime(timeCB.getSelectedItem().toString());
                customerbooking.setFlightfee(feeCB.getSelectedItem().toString());
                customerbooking.setCar(carRB.isSelected());
                customerbooking.setInsurance(insuranceRB.isSelected());

                oos.writeObject(customerbooking);
                oos.close();
                fos.close();

                custnameTF.setText("");
                custsurnameTF.setText("");
                custidTF.setText("");
                considTF.setText("");
                consnameTF.setText("");
                conssurnameTF.setText("");
                locationCB.setSelectedItem("");
                timeCB.setSelectedItem("");
                feeCB.setSelectedItem("");

【问题讨论】:

  • 您宁愿寻找HashMap 而不是ArrayList 以便能够更好地识别值。但是Booking 类中的 6 个单变量有什么坏处呢?
  • 当然可以 - 但问题是:这样做是否明智?我会说不,因为您介绍了错误的来源并丢失了信息(例如字段名称等)。
  • Java 不是 Javascript。请为标签和语言标签使用正确的内容。
  • 由于我有一段时间没有使用 Swing 我不是这里的专家,但是 IIRC 你可以使用 bean 自省将属性绑定到 ui 组件,即你可以为组件提供一个属性名称和一个 bean 和框架将处理两者之间的传输 - 您搜索的关键字将是“java 数据绑定”,也可能是“swing”或“javafx”。

标签: java arrays list class properties


【解决方案1】:

简短的回答是“不”。

使用隐含顺序处理列表中的属性值以映射到数据对象是很脆弱的。

然而,有时使用属性更改支持或 bean 之类的东西来管理对象的属性是非常有用的,尽管 ArrayList 与至少一个属性名称的 Map 相比,是一个糟糕的数据结构选择值或更彻底的数据绑定解决方案,例如表示键的类型化属性、将键映射到值的对以及存储当前值和突变的数据结构。

有些地方必须将您的属性名称与数据对象类的访问器和修改器相匹配。这可以使用诸如数据绑定或属性到字段映射的一些自定义解决方案之类的库来完成,或者可能将您的状态存储在数据对象内的Map 中。在保持类型安全的同时,有很多复杂的方法可以做到这一点,但许多解决方案将属性处理为String,将值处理为Object,并丢弃类型信息和类型检查,因此这将是实现它的一个障碍。

您问题的另一个相关部分应该是变更管理,并且只写发生变化的事情。例如,如果您的某个字段发生更改,您不需要覆盖数据对象的所有其他字段,而只需覆盖不同的字段。无论您是转向基于属性的更新模型还是坚持显式使用访问器和修改器,您都应该对此进行调查。如果使用基于属性的方法,您可以聚合或通过委托给处理程序处理属性,则 UI 中的代码应该蒸发并传递给可以处理类型安全、更改管理、触发后续更改事件的库,和其他相关问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    相关资源
    最近更新 更多