JavaRush /Blog Java /Random-ES /Métodos predeterminados en interfaces

Métodos predeterminados en interfaces

Publicado en el grupo Random-ES
Cada nueva versión de Java es diferente a las anteriores. Aquí hay un ejemplo de los cambios del material que cubrimos: Antes de Java 5, no había enum's' en el lenguaje.
Métodos predeterminados en interfaces - 1
Asimismo, Java 8 es notablemente diferente de Java 7. La mayoría de nuestras conferencias están escritas en la séptima versión del lenguaje, pero, por supuesto, no ignoraremos innovaciones importantes. Dado que en esta conferencia estamos hablando de interfaces, veamos una actualización: métodos predeterminados en las interfaces . Ya sabes que una interfaz no se implementa . Su tarea es describir qué comportamiento deben tener todos los objetos que lo implementan . Pero muy a menudo los desarrolladores se encontraron con situaciones en las que la implementación de un método en todas las clases era la misma. Veamos el ejemplo de nuestro coche viejo:
public interface Car {

   public void gas();

   public void brake();
}
public class Sedan implements Car {

   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class Truck implements Car {

   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class F1Car implements Car {
   @Override
   public void gas() {
       System.out.println("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}
¿Cuál crees que es el principal problema con este código? ¡Probablemente hayas notado que escribimos mucho del mismo código! Este problema es común en la programación y debe evitarse. Otra cosa es que antes del lanzamiento de Java 8 no existían opciones de solución especiales. Cuando salió esta versión, fue posible definir métodos predeterminados e implementarlos directamente dentro de la interfaz. Así es como se hace:
public interface Car {

   public default void gas() {
       System.out.println("Газ!");
   }

   public default void brake() {
       System.out.println("Тормоз!");
   }
}

public class Sedan implements Car {

}

public class Truck implements Car {

}

public class F1Car implements Car {

}
Ahora los métodos gas()y brake(), que eran los mismos para todas las máquinas, están incluidos en la interfaz y no es necesario duplicar el código. Además, ¡los métodos están disponibles en cada una de las clases!
public class Main {

   public static void main(String[] args) {

       F1Car f1Car = new F1Car();
       Sedan sedan = new Sedan();
       Truck truck = new Truck();
       truck.gas();
       sedan.gas();
       f1Car.brake();
   }
}
¿Qué pasa si hay 100 clases con un método gas(), pero sólo 99 de ellas tienen el mismo comportamiento? ¿Esto arruina todo y el método predeterminado no funcionará en este caso? Por supuesto que no :) Los métodos predeterminados de las interfaces se pueden anular.
public class UnusualCar implements Car {
   @Override
   public void gas() {
       System.out.println("Эта машина газует по-другому!");
   }

   @Override
   public void brake() {
       System.out.println("Эта машина тормозит по-другому!");
   }
}
Los otros 99 tipos de máquinas implementarán el método predeterminado, y la clase UnusualCar, la excepción, no estropeará el panorama general y determinará con calma su comportamiento. Herencia múltiple en interfaces Como ya sabes, no existe herencia múltiple en Java. Hay muchas razones para esto; las veremos en detalle en una conferencia separada. En otros lenguajes, por ejemplo en C++, ocurre al revés. Sin herencia múltiple, surge un problema grave: el mismo objeto puede tener varias características y "comportamientos" diferentes. Un ejemplo de la vida: para nuestros padres somos niños, para los profesores somos estudiantes, para los médicos somos pacientes. En la vida asumimos diferentes roles y, en consecuencia, nos comportamos de manera diferente: obviamente hablaremos con los profesores de manera diferente que con los amigos cercanos. Intentemos traducir esta situación a código. Imaginemos que tenemos dos clases: Pond y Aviary. Para un estanque se necesitan pájaros nadadores y para un aviario, pájaros voladores. Para hacer esto, creamos dos clases base: FlyingBirdy Waterfowl.
public class Waterfowl {
}

public class FlyingBird {
}
En consecuencia, enviaremos al aviario aquellas aves cuyas clases son heredadas de FlyingBird, y al estanque, aquellas que descienden de Waterfowl. Todo parece sencillo. Pero, ¿qué haremos si necesitamos identificar al pato en alguna parte? Ella nada y vuela. Pero no tenemos herencia múltiple. Afortunadamente, Java proporciona múltiples implementaciones de interfaces. Si una clase no puede heredar de varios padres, ¡implementar varias interfaces es fácil! Nuestro pato puede volar y nadar :) Basta con utilizar interfaces FlyingBirden lugar Waterfowlde clases para lograr el resultado deseado.
public class Duck implements FlyingBird, Waterfowl {

   //методы обоих интерфейсов легко объединяются в одном классе

   @Override
   public void fly() {
       System.out.println("Летим!");
   }

   @Override
   public void swim() {

       System.out.println("Плывем!");
   }
}
Gracias a esto, nuestro programa conserva una gestión de clases flexible y, en combinación con la implementación de métodos predeterminados, nuestra capacidad para definir el comportamiento de los objetos se vuelve casi ilimitada. :)
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION