== Why is this an issue?

Referencing a static member of a subclass from its parent during class initialization, makes the code more fragile and prone to future bugs.
The execution of the program will rely heavily on the order of initialization of classes and their static members.

=== What is the potential impact?

This could create what is known as an "initialization cycle", or even a deadlock in some extreme cases.
Additionally, if the order of the static class members is changed, the behavior of the program might change.
These issues can be very hard to diagnose so it is highly recommended to avoid creating this kind of dependencies.


=== Noncompliant code example

[source,java]
----
class Parent {
  static int field1 = Child.method(); // Noncompliant
  static int field2 = 42;

  public static void main(String[] args) {
    System.out.println(Parent.field1); // will display "0" instead of "42"
  }
}

class Child extends Parent {
  static int method() {
    return Parent.field2;
  }
}
----


== Resources

* CERT - https://wiki.sei.cmu.edu/confluence/display/java/DCL00-J.+Prevent+class+initialization+cycles[DCL00-J. Prevent class initialization cycles]
* https://docs.oracle.com/javase/specs/jls/se17/html/jls-12.html#jls-12.4[Section 12.4: Initialization of Classes and Interfaces] - Java Language Specification

ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

=== Message

Remove this reference to "xxx".

== Comments And Links
(visible only on this page)

=== on 07 Jun 2023, 15:18:13 Leonardo Pilastri wrote:
The rule is very limited and is mentioning the parent-child class relationship, which is actually not the root cause.
Should be reworked.

endif::env-github,rspecator-view[]
