Favorece composición sobre herencia

Cuando queremos crear una clase reutilizando la funcionalidad de otra clase, podemos pensar en usar herencia. Pero, ¿Es esta la mejor solución?

Herencia

En Java solo podemos extender de una clase, al extender tendremos la funcionalidad extr…


This content originally appeared on DEV Community and was authored by Elías Canales

Cuando queremos crear una clase reutilizando la funcionalidad de otra clase, podemos pensar en usar herencia. Pero, ¿Es esta la mejor solución?

Herencia

En Java solo podemos extender de una clase, al extender tendremos la funcionalidad extra de todas las superclases, ya que, aunque solo podemos heredar de una clase, esa clase a su vez puede heredar de otra.

public abstract class Automobile {
    private final String brand;

    public String getBrand() {
        return brand;
    }
}

public class Car extends Automobile {
    private final int seats;

    public Car(String brand, int seats) {
        super(brand);
        this.seats = seats;
    }

    public int getSeats() {
        return seats;
    }
}

public class Sports extends Car {

    public Sports(String brand, int seats) {
        super(brand, seats);
    }

    @Override
    public String getBrand() {
        return null;
    }
}

La clase Sport hereda de Car y la de Car de Automobile. En este caso que las propiedades son privadas no podemos acceder directamente, pero sí que podemos alterar el método getBrand().

Aunque solo tendremos acceso a los atributos y funciones que no tengan el modificador de acceso private. Para la herencia es interesante el modificador de acceso protected, ya que permite acceder desde la clase que hereda, incluso si está en otro paquete.

La herencia rompe la encapsulación, podemos alterar el objetivo real del objeto. Al sobrescribir métodos, y dependiendo de cómo se haya diseñado el objeto, podemos alterar el funcionamiento original de la clase.

Por eso, tenemos que hacer la pregunta de si realmente necesitamos que se herede uno de los objetos fuera del paquete, pero también si es necesario que hereden de ese objeto, si realmente existe una relación de herencia entre ambos objetos (subclase y superclase)..

Encapsulación

Consiste en no permitir el acceso a propiedades, métodos o clases, utilizando los modificadores de acceso (private, default, protected y public). Con esto podemos prevenir el mal uso de nuestras clases, forzando a permitir acceder a aquello estrictamente necesario.

Composición

La composición es una forma de darle funcionalidad a nuestra clase, pero no sobrescribimos los métodos de la clase original. Estamos creando una nueva clase.
En programación se traduce básicamente en tener un atributo, si en lugar de heredar tenemos esa clase como atributo.

Veamos que pasaría si tenemos una clase que hereda de ArrayList, creamos la clase CarList, nosotros queremos tener un conteo de las marcas de los coches cuando se añade un nuevo coche a la CarList.

public class CarList extends ArrayList<Car> {

    private final HashMap<String, Integer> carBrandCount;

    public void addCar(Car car) {
        //count car brands
    }

}

A priori no hay ningún problema, tenemos nuestra CarList, donde contamos las marcas y así pues luego no tenemos que contar cada vez que nos lo pidan. Pero si tu instancias el CarList verás métodos que no tienen ningún sentido:

Tenemos el addCar que creamos nosotros, pero también tenemos addAll, add, stream…

Como dijimos antes, la herencia rompe la encapsulación, ahora pueden manipular el estado interno de nuestro objeto (la lista de los coches), con métodos que nosotros no queremos exponer o que romperían el correcto funcionamiento.

Una solución a este problema es la composición, si tenemos la lista como atributo de la clase, podemos exponer los métodos que nos interesen, y controlar el funcionamiento de nuestra CarList, y por supuesto, no utilizar la herencia.

Referencias
Joshua Bloch, Effective Java (3ª edición), Addison-Wesley, 2018.


This content originally appeared on DEV Community and was authored by Elías Canales


Print Share Comment Cite Upload Translate Updates
APA

Elías Canales | Sciencx (2025-08-26T12:00:00+00:00) Favorece composición sobre herencia. Retrieved from https://www.scien.cx/2025/08/26/favorece-composicion-sobre-herencia/

MLA
" » Favorece composición sobre herencia." Elías Canales | Sciencx - Tuesday August 26, 2025, https://www.scien.cx/2025/08/26/favorece-composicion-sobre-herencia/
HARVARD
Elías Canales | Sciencx Tuesday August 26, 2025 » Favorece composición sobre herencia., viewed ,<https://www.scien.cx/2025/08/26/favorece-composicion-sobre-herencia/>
VANCOUVER
Elías Canales | Sciencx - » Favorece composición sobre herencia. [Internet]. [Accessed ]. Available from: https://www.scien.cx/2025/08/26/favorece-composicion-sobre-herencia/
CHICAGO
" » Favorece composición sobre herencia." Elías Canales | Sciencx - Accessed . https://www.scien.cx/2025/08/26/favorece-composicion-sobre-herencia/
IEEE
" » Favorece composición sobre herencia." Elías Canales | Sciencx [Online]. Available: https://www.scien.cx/2025/08/26/favorece-composicion-sobre-herencia/. [Accessed: ]
rf:citation
» Favorece composición sobre herencia | Elías Canales | Sciencx | https://www.scien.cx/2025/08/26/favorece-composicion-sobre-herencia/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.