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! Métodos padrão em interfaces - 2Nosso 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