Финальные члены с несколькими конструкторами - PullRequest
0 голосов
/ 30 октября 2018

У меня есть такой класс.

    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 голосов
/ 30 октября 2018

В Java финальные переменные должны быть инициализированы только один раз, до или внутри конструктора.

0 голосов
/ 30 октября 2018

Заполните все поля final в каждом конструкторе. Вызов другого конструктора следующим образом:

public AuditEvent() {
    this("" /*timeStamp*/, "" /*userName*/, "" /*loggedInUserHostOrIP*/, "" /*objectName*/);
}
0 голосов
/ 30 октября 2018

A 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("...", "...", ...);
}
0 голосов
/ 30 октября 2018

Вы объявили m_timeStamp как final, но никогда не инициализировали его в пустом конструкторе.

Каждый конструктор должен объявлять переменную, если она окончательная, а не только одну. Или вы можете инициализировать его после объявления, что также будет действительным. например,

private final String m_timeStamp = "test";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...