如果构造函数值为null,我可以给它一个默认值吗



我正在使用回收器视图在我的应用程序上显示数据。当我想从我正在使用的API获取信息时,我将接受14个不同的变量。

for(int i = 0; i<array.length();i++){
JSONObject object = array.getJSONObject(i);
//object.getJSONObject("test");
Personnel personnel = new Personnel(
object.getInt("contactType"),
object.getString("currentTime"),
object.getString("clockIn"),
object.getString("clockOut"),
object.getInt("isClockedIn"),
object.getString("clockInPhotoName"),
object.getDouble("clockInLat"),
object.getDouble("clockInLng"),
object.getDouble("clockOutLat"),
object.getDouble("clockOutLng"),
object.getDouble("projectSiteLat"),
object.getDouble("projectSiteLng"),
object.getDouble("clockInDistanceFromProjectSiteInMetres"),
object.getDouble("clockOutDistanceFromProjectSiteInMetres")
);
personnelList.add(personnel);
}

但是在http调用的响应体中,例如,有时调用"isClockedIn"的对象可能是空的,如果我这样做,那么我的构造函数就不会生成对象。

这是我很长的构造函数:

public Personnel(int contactType, String totalTimeSummary, String clockInTime, String clockOutTime, int isClockedIn, String clockInPhotoName, double clockInLat, double clockInLong, double clockOutLat, double clockOutLong, double projectLat, double projectLong, double clockInDistance, double clockOutDistance) {
this.contactType = contactType;
this.totalTimeSummary = totalTimeSummary;
this.clockInTime = clockInTime;
this.clockOutTime = clockOutTime;
this.isClockedIn = isClockedIn;
this.clockInPhotoName = clockInPhotoName;
this.clockInLat = clockInLat;
this.clockInLong = clockInLong;
this.clockOutLat = clockOutLat;
this.clockOutLong = clockOutLong;
this.projectLat = projectLat;
this.projectLong = projectLong;
this.clockInDistance = clockInDistance;
this.clockOutDistance = clockOutDistance;
}

我环顾四周,发现如果我的另一个构造函数没有填充所有需要的变量,你可以创建一个默认的构造函数,但我当然不想这样做,因为那样所有的参数都会是空的。

干杯。

您可以使用optDouble而不是调用getDouble。第一个值应该是您已经使用的密钥,第二个值应该为在服务器响应中找不到密钥时将使用的值。

你可以在这里找到一些真实世界的例子:https://www.programcreek.com/java-api-examples/?class=org.json.JSONObject&method=optDouble

您不应该使用基元变量。例如,int不能为null,另一方面,integer类型可以为null。看看这个链接

正如GhostCat所建议的,您应该真正考虑构建器模式,例如:

public Personnel {
public static class Builder {
int contactType;
//all the other members
public Builder contactType(int contactType) {
this.contactType = contactType;
return this;
}
public Personnel build() {
Personnel personnel = new Personnel();
personnel.contactType = this.contactType;
}
}

int contactType;
//all the other members
private Personnel() {}
// getters and setters
}
Personnel personnel = new Personnel.Builder()
.contactType(0)
.build();

最新更新