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.
public final class MyFinalClass { protected String name = "Fred"; // Noncompliant protected void setName(String name) { // Noncompliant // ... }
public final class MyFinalClass { private String name = "Fred"; public void setName(String name) { // ... }
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 // ... } }