herencia java inheritance

herencia - polymorphism in java



Detener herencia sin usar final (8)

¿Hay algún otro método para detener la herencia de una clase aparte de declararla como definitiva o declarar su constructor como privado?


  • Use final
  • Usa constructores privados
  • Use un comentario:

    // do not inherit

  • Use un comentario javadoc

  • Haga que todos los métodos sean definitivos, para que las personas no puedan anularlos
  • Use un control de tiempo de ejecución en el constructor de la clase:

    if (this.getClass() != MyClass.class) { throw new RuntimeException("Subclasses not allowed"); }


Dos opciones más:

  • haga que cada método sea definitivo, para que la gente no pueda anularlos. Evita la llamada accidental de métodos desde la subclase de esta manera. Sin embargo, esto no detiene la subclasificación.

  • poner el cheque en el constructor para la clase:

    if (this.getClass() != MyClass.class) { throw new RuntimeException("Subclasses not allowed"); }

    Entonces nadie podrá instanciar la subclase de tu clase.

(No es que sugiera usar estas técnicas, me vino a la mente. Utilizaría la clase final y / o el constructor privado)


Final fue creado para resolver este problema.


Tendría que decir que es típicamente mala forma. Aunque casi siempre hay casos en que algo es válido, tendría que decir que detener la herencia en un mundo OO normalmente no es una buena idea. Lea sobre el principio abierto-cerrado y aquí . Proteja su funcionalidad, pero no lo haga imposible para el tipo que entra y lo admite ...


Un comentario

//Do not inherit please


Usar final es la manera canónica.

public final class FinalClass { // Class definition }

Si desea evitar que se anulen los métodos individuales, puede declararlos como definitivos. (Solo estoy adivinando aquí, por qué querrías evitar hacer que toda la clase sea definitiva).


Haga que sus constructores sean privados y proporcione funciones de fábrica para crear instancias.

Esto puede ser especialmente útil cuando desea elegir una implementación adecuada de múltiples, pero no desea permitir el uso de subclases arbitrarios como en

abstract class Matrix { public static Matrix fromDoubleArray(double[][] elemens) { if (isSparse(elements)) { return new SparseMatrix(elements); } else { return new DenseMatrix(elements); } } private Matrix() { ... } // Even though it''s private, inner sub-classes can still use it private static class SparseMatrix extends Matrix { ... } }


Sin usar una clase final, básicamente puedes hacer que todos los constructores sean privados:

public class A { private A() {} //Overriding default constructor of Java }

Lo cual, aunque también hará que esta clase sea abstracta, al rechazar crear un objeto de esta clase, sin embargo, como cualquier herencia requiere super(); en el constructor, y debido a que el constructor es privado, un error de compilación será el máximo que se puede obtener cuando uno trata de heredar esa clase. Sin embargo, recomendaría usar final en su lugar, ya que es menos código e incluye la opción de crear objetos.