我有一个这样的班。
public class AuditEvent {
private final String m_timeStamp;
private final String m_userName;
private int m_moduleId;
private int m_actionId;
private final String m_objectName;
private final String m_loggedInUserHostOrIP;
public AuditEvent() {
// No content
}
public AuditEvent(String timeStamp, String userName, String loggedInUserHostOrIP, String objectName) {
if (StringUtils.nullOrEmpty(timeStamp)) {
throw new IllegalArgumentException("The timeStamp field is not supplied");
}
if (StringUtils.nullOrEmpty(timeStamp)) {
throw new IllegalArgumentException("The userName field is not supplied");
}
if (null == objectName) {
throw new IllegalArgumentException("The objectName field is not supplied");
}
if (null == loggedInUserHostOrIP) {
throw new IllegalArgumentException("The loggedInUserHostOrIP field is not supplied");
}
m_timeStamp = timeStamp;
m_userName = userName;
m_loggedInUserHostOrIP = loggedInUserHostOrIP;
m_objectName = objectName;
}
但是这会导致错误,即最终字段m_userName可能尚未初始化。如果我没有空的构造函数,它将起作用。谁能帮助我解决这个问题?
答案 0 :(得分:0)
您已将m_timeStamp
声明为final
,但从未在空的构造函数中对其进行初始化。
每个构造函数都应声明变量(如果是最终变量),而不仅仅是一个。或者,您也可以在声明后对其进行初始化,这同样有效。例如
private final String m_timeStamp = "test";
答案 1 :(得分:0)
填写每个构造函数中的所有final
字段。如下调用另一个构造函数会有所帮助:
public AuditEvent() {
this("" /*timeStamp*/, "" /*userName*/, "" /*loggedInUserHostOrIP*/, "" /*objectName*/);
}
答案 2 :(得分:0)
由于对象已完全构建且构造函数已返回,因此必须初始化final
字段 。
此处final
字段从不值:
public AuditEvent() {
// No content
}
因此,如果您调用此构造函数而不调用另一个构造函数,则会违反final
约束。而编译错误。
如果在您的用例中no arg构造函数有意义,您仍然可以定义字段初始化程序,例如:
private final String m_timeStamp = "...";
private final String m_userName = "...";
或者将no arg构造函数链接到args构造函数:
public AuditEvent() {
this("...", "...", ...);
}
答案 3 :(得分:0)
在Java中,最终变量只能在构造函数之前或内部初始化一次。