CodeGym /Blogue Java /Random-PT /Métodos padrão em interfaces
John Squirrels
Nível 41
San Francisco

Métodos padrão em interfaces

Publicado no grupo Random-PT
Cada nova versão do Java difere daquelas que vieram antes. Aqui está um exemplo de mudanças no material que abordamos: antes do Java 5, a linguagem não tinha enums. Métodos padrão em interfaces - 1Da mesma forma, o Java 8 difere consideravelmente do Java 7. A maioria de nossas lições foi escrita para a 7ª versão da linguagem, mas é claro que não vamos ignorar inovações importantes. Como já estamos falando sobre interfaces nesta lição, consideraremos uma atualização — métodos padrão em interfaces . Você já sabe que uma interface não implementa o comportamento . Sua tarefa é descrever o comportamento que todos os objetos que o implementam devem ter. Mas os desenvolvedores frequentemente encontram situações em que a implementação de um método é a mesma em todas as classes. Vamos considerar nosso exemplo de carro antigo:

public interface Car {

   public void gas();

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

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

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}


public class Truck implements Car {

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

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}


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

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}
"Na sua opinião, qual é o principal problema com este código? Você provavelmente notou que escrevemos um monte de código repetido! Esse problema é comum na programação e você precisa evitá-lo. Outra questão é que soluções específicas não existiam antes O Java 8 foi lançado. Com esta versão veio a capacidade de especificar métodos padrão e implementá-los diretamente na interface! Veja como fazer isso:

public interface Car {

   public default void gas() {
       System.out.println("Gas!");
   }

   public default void brake() {
       System.out.println("Brake!");
   }
}

public class Sedan implements Car {

}

public class Truck implements Car {

}

public class F1Car implements Car {

}
Agora os métodos gas()e brake(), que eram os mesmos para todos os carros, foram movidos para a interface. Nenhum código repetido é necessário. Além do mais, os métodos estão disponíveis em cada classe!

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();
   }
}
E se houver 100 classes com o gas()método, mas apenas 99 delas tiverem o mesmo comportamento? Isso arruína tudo e torna o método padrão inadequado para esta situação? Claro que não :) Os métodos padrão em interfaces podem ser substituídos da mesma forma que os comuns.

public class UnusualCar implements Car {
   @Override
   public void gas() {
       System.out.println("This car accelerates differently!");
   }

   @Override
   public void brake() {
       System.out.println("This car decelerates differently!");
   }
}
Todos os outros 99 tipos de carros implementarão o método padrão, e oUnusualCarA classe, que é uma exceção, não estraga o quadro geral e define calmamente seu próprio comportamento. Herança múltipla de interfaces. Como você já sabe, Java não suporta herança múltipla. Há muitas razões para isto. Vamos examiná-los em detalhes em uma lição separada. Outras linguagens, como C++, o suportam. Sem herança múltipla, surge um problema sério: um objeto pode ter várias características e 'comportamentos' diferentes. Aqui está um exemplo da vida: somos filhos para nossos pais, alunos para nossos professores e pacientes para nossos médicos. Na vida, assumimos papéis diferentes e, portanto, nos comportamos de maneira diferente: obviamente, não falaríamos com os professores da mesma forma que falamos com nossos amigos mais próximos. Vamos tentar traduzir isso em código. Imagine que temos duas classes: Lagoa e Aviário. Para a lagoa, precisamos de aves aquáticas; para o aviário, precisamos de pássaros voadores. Para fazer isso, criamos duas classes base:FlyingBirde Waterfowl.

public class Waterfowl {
}

public class FlyingBird {
}
Assim, enviaremos os pássaros cujas classes herdam FlyingBirdpara o aviário e enviaremos os pássaros que herdam Waterfowlpara o lago. Tudo parece muito simples. Mas para onde mandamos um pato? Ele nada e voa. E não temos herança múltipla. Felizmente, o Java suporta várias implementações de interfaces. Embora uma classe não possa herdar vários pais, ela pode facilmente implementar várias interfaces! Nosso pato pode ser tanto um pássaro voador quanto uma ave aquática :) Simplesmente precisamos criar interfaces FlyingBirde, Waterfowlem vez de classes, para alcançar o resultado desejado.

public class Duck implements FlyingBird, Waterfowl {

   // The methods of both interfaces can be easily combined into one class

   @Override
   public void fly() {
       System.out.println("Fly!");
   }

   @Override
   public void swim() {

       System.out.println("Swim!");
   }
}
Da mesma forma, nosso programa retém a flexibilidade das classes e, em combinação com os métodos padrão, nossa capacidade de definir o comportamento dos objetos torna-se quase ilimitada! :)
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION