Since Checkstyle 3.1


Ensures that identifies classes that can be effectively declared as final are explicitly marked as final. The following are different types of classes that can be identified:

  1. Private classes with no declared constructors.
  2. Classes with any modifier, and contains only private constructors.

Classes are skipped if:

  1. Class is Super class of some Anonymous inner class.
  2. Class is extended by another class in the same file.


To configure the check:

<module name="Checker">
  <module name="TreeWalker">
    <module name="FinalClass"/>


public class Example1 { // ok, since it has a public constructor

  final class A {
    private A() {

  class B { // violation, 'Class B should be declared as final.'
    private B() {

  class C { // ok, since it has a public constructor
    int field1;
    String field2;

    private C(int value) {
      this.field1 = value;
      this.field2 = " ";

    public C(String value) {
      this.field2 = value;
      this.field1 = 0;

  class AnonymousInner { // ok, class has an anonymous inner class.
    public final AnonymousInner ONE
            = new AnonymousInner() {

    private AnonymousInner() {

  class Class1 {

    private class Class2 { // violation, 'Class Class2 should be declared as final'

    public class Class3 {


Example of Usage

Violation Messages

All messages can be customized if the default message doesn't suit you. Please see the documentation to learn how to.


Parent Module