具有多个构造函数的最终成员

时间:2018-10-30 15:24:02

标签: java constructor final

我有一个这样的班。

    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可能尚未初始化。如果我没有空的构造函数,它将起作用。谁能帮助我解决这个问题?

4 个答案:

答案 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中,最终变量只能在构造函数之前或内部初始化一次。