重载构造函数



我有这个MyClass,有3个字段。但是我需要将数据类型info更改为Info的对象,以容纳更多的2个字段。字符串info,将等同于info.text。但是在MyClass构造函数上有很多if调用,我们不想改变它,因为唯一必需的字段是info.text.。如何重载构造函数?因为有些人会用对象Info作为参数而不是String来调用新的构造函数。

public class MyClass {

private String status;
private String reason;
private String info;
public MyClass(final String status, final String reason, final String info) {                                  
this.status= status;
this.reason= reason;
this.info= StringUtils.trimToNull(info);
}
}
@Getter
@Setter
public class Info {
private String text;
private String image;
private String details;
}

如果我没弄错的话,你可能会想要这样的内容:

public class MyClass {       
private String status;
private String reason;
private Info info;
public MyClass(final String status, final String reason, final Info info) {                                  
this.status= status;
this.reason= reason;
this.info = info;
}

public MyClass(final String status, final String reason, final String infoText) {                                  
this(status, reason, new Info().setText(StringUtils.trimToNull(infoText));
}

含义:你改变你的类有一个Info对象,而不是一个"Info"字符串。然后你允许通过传递一个Info对象来创建你的类;但是您保留现有的构造函数,但是您调用新的构造函数,并传入一个Info对象,该对象使用text属性设置。

当然,只有当你的setter返回它们正在设置的对象时才有效。如果你的setter返回类型是void,那就"技巧"调用另一个构造函数是不可能的,在这种情况下,您将最终得到两个非常相似但略有不同的构造函数体。

对GhostCat的回答进行扩展。按照我的理解,你需要保留旧的构造函数、getter和setter来支持Legacy。您可以替换String info字段,但仍然需要它的setter和getter。您可以重载setInfo()方法,并为新字段添加一个新的getter。此外,Info类需要覆盖Info类中的toString()方法,以返回与遗留代码期望的相同格式的String

public class MyClass {       
private String status;
private String reason;
private Info info;
// constructors
public void setInfo(String info) {
// convert String to Info and set in field
}
public String getInfo () {
return info.toString(); // need to override toString() in Info class
}
// new getter and setter
// Overloaded method (different param list)
public void setInfo (Info info) {
this.info = info;
}
// cannot use same name because param list is the same
public Info getInfo2() {
return info;
}
}

最新更新