如何根据表单字段选择要实例化的对象类型?

时间:2014-06-23 17:59:56

标签: java oop struts2

我有一个struts2表单,它接受一个Maintenance对象。有不同类型的维护 - 为了简洁起见,我们假设有RemovePart和InstallPart。此表单包含两者的字段,但用户只能看到一个 - 这是基于用户在第一个下拉列表中的选择。

在我的Action收到数据后,确定要实例化哪个维护类的正确(最佳?)方法是什么?到目前为止,我提出的最好的是下面,但我不禁想到有更好的方法来做到这一点。

编辑6月24日14:18 GMT:RemovedPart和InstalledPart类的字段彼此不对应。

public class Maintenance {
    private String maintenanceType;

    private String removedSerialNumber;
    private String removedPartName;
    private String removedPartDescription;
    private String removedPartPosition;

    private String installedSerialNumber;
    private String installedPartName;
    private String installedPartSource;

    // getters and setters
}

public class RemovedPart {
    private String serialNumber;
    private String partName;
    private String partDescription;
    private String partPosition;

    public static createRemovedPart(Maintenance maintenance) {
        return new RemovedPart(maintenance.getRemovedSerialNumber(),
            maintenance.getRemovedPartName(), maintenance.getRemovedPartDescription(),
            maintenance.getRemovedPartPosition());
    }

    private RemovedPart() {
      this.serialNumber = serialNumber;
      this.PartName = partName;
      this.partDescription = partDescription;
      this.partPosition = partPosition;
    }

    // getters and setters
}

public class InstalledPart {
    //similar to RemovedPart
}

public class MaintAction extends ActionSupport {
    Maintenance maintenance;

    public String execute() {
        if (maintenance.getMaintenanceType().equals("remove")) {
            RemovedPart removed = RemovedPart.createRemovedPart(maintenance);
        } else {
            // you get the idea
        }
        // more logic
        return SUCCESS;
    }

2 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,您想要进行多种维护吗?

在这种情况下,你应该考虑继承

public abstract class Maintenance{
//code
}

public class Removal extends Maintenance{
     //has everything Maintenance hase plus extras you can add here
}

public class Installation extends Maintenance{
    //same as Removal
}

然后您可以像这样定义维护:

Mainenance m = new Removal();

你也可以使用接口,

public Interface Maintenance{
    private String serialNumber;
    ...
    public String getSerialNumber();
    ...
}

然后您的类可以实现接口,您可以使用它们类似于继承的版本。

答案 1 :(得分:2)

我们无法知道您的设计有多复杂或多大,但从显示的内容来看, IF 维护类正在声明重复的字段(例如,删除和安装的序列号)没有同时使用它们,因此它们只被声明从页面中选择的维护类型填充...那么你不需要3个对象,也不需要重复的字段:

  • 声明单个维护类,包含单个字段
  • 将其发布到不同的操作,一个用于删除,一个用于安装。

单独的类型将帮助您确定从两种类型运行的方法处理哪种维护。但是,将它变成Enum会更好:

public enum MaintenanceType {
    INSTALLATION(1), REMOVAL(2);

    private int type;

    private MaintenanceType(int t) {
        type = t;
    }

    public int getType() {
        return type;
    }
}

public class Maintenance {

    private MaintenanceType type;

    private String serialNumber;
    private String partName;

    // getters and setters

    public boolean isInstallation(){
        return type == MaintenanceType.INSTALLATION;
    };
    public boolean isRemoval(){
        return type == MaintenanceType.REMOVAL;
    };
}