## Why is this an issue?

The difference between `private` and `protected` visibility is that child classes can see and use `protected` members, but they cannot see `private` ones. Since a `final` class will have no children, marking the members of a `final` class `protected` is confusingly pointless.

Note that the `protected` members of a class can also be seen and used by other classes that are placed within the same package, this could lead to accidental, unintended access to otherwise private members.

### Noncompliant code example

    public final class MyFinalClass {

      protected String name = "Fred";  // Noncompliant
      protected void setName(String name) {  // Noncompliant
        // ...
      }

### Compliant solution

    public final class MyFinalClass {

      private String name = "Fred";
      public void setName(String name) {
        // ...
      }

### Exceptions

Members annotated with `@VisibleForTesting` annotation are ignored, as it indicates that visibility has been purposely relaxed to make the code testable.

    public final class MyFinalClass {
      @VisibleForTesting
      protected Logger logger; // Compliant

      @VisibleForTesting
      protected int calculateSomethingComplex(String input) { // Compliant
        // ...
      }
    }