== Why is this an issue?

Calling an overridable method from a constructor could result in failures or strange behaviors when instantiating a subclass which overrides the method.


For example:

* The subclass class constructor starts by contract by calling the parent class constructor.
* The parent class constructor calls the method, which has been overridden in the child class.
* If the behavior of the child class method depends on fields that are initialized in the child class constructor, unexpected behavior (like a `NullPointerException`) can result, because the fields aren't initialized yet.

=== Noncompliant code example

[source,text]
----
public class Parent {

  public Parent () {
    doSomething();  // Noncompliant
  }

  public void doSomething () {  // not final; can be overridden
    ...
  }
}

public class Child extends Parent {

  private String foo;

  public Child(String foo) {
    super(); // leads to call doSomething() in Parent constructor which triggers a NullPointerException as foo has not yet been initialized
    this.foo = foo;
  }

  public void doSomething () {
    System.out.println(this.foo.length());
  }

}
----

== Resources

* https://wiki.sei.cmu.edu/confluence/x/8zZGBQ[CERT, MET05-J.] - Ensure that constructors do not call overridable methods
* https://wiki.sei.cmu.edu/confluence/x/6ns-BQ[CERT, OOP50-CPP.] - Do not invoke virtual functions from constructors or destructors

include::../rspecator.adoc[]