我有一个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;
}
答案 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;
};
}