Palabra clave de método Java "final" y su uso

Cuando creo jerarquías de tipos complejas (varios niveles, varios tipos por nivel), me gusta usar elfinal palabra clave sobre métodos que implementan alguna declaración de interfaz. Un ejemplo:

interface Garble {
  int zork();
}

interface Gnarf extends Garble {
  /**
   * This is the same as calling {@link #zblah(0)}
   */
  int zblah();
  int zblah(int defaultZblah);
}

Y entonces

abstract class AbstractGarble implements Garble {
  @Override
  public final int zork() { ... }
}

abstract class AbstractGnarf extends AbstractGarble implements Gnarf {
  // Here I absolutely want to fix the default behaviour of zblah
  // No Gnarf shouldn't be allowed to set 1 as the default, for instance
  @Override
  public final int zblah() { 
    return zblah(0);
  }

  // This method is not implemented here, but in a subclass
  @Override
  public abstract int zblah(int defaultZblah);
}

Hago esto por varias razones:

Me ayuda a desarrollar la jerarquía de tipos. Cuando agrego una clase a la jerarquía, está muy claro, qué métodos tengo que implementar y qué métodos no puedo anular (en caso de que olvide los detalles sobre la jerarquía)Pienso primordialhormigón las cosas son malas según los principios y patrones de diseño, como eltemplate method modelo. No quiero que otros desarrolladores o mis usuarios lo hagan.

Entonces elfinal La palabra clave funciona perfectamente para mí. Mi pregunta es:

¿Por qué se usa tan raramente en la naturaleza? ¿Me puede mostrar algunos ejemplos / razones dondefinal (en un caso similar al mío) sería muy malo?

Respuestas a la pregunta(5)

Su respuesta a la pregunta