[MÚSICA] Meu nome é Eduardo Guerra, este é o curso de Orientação a Objetos com Java. Hoje vamos pegar e exemplificar o uso de interfaces. Eu sei que compreender esta ideia de interfaces não é simples, eu digo por experiência própria e pelo dia que eu criei a minha interface, falei assim: esse problema eu vou resolver utilizando interfaces. Aquele dia, eu acho que caiu a ficha de como fazer a modelagem orientada a objeto. Eu sei que não é fácil, então preparei esta aula pra vocês entenderem melhor como que funcionam as interfaces, como que elas são utilizadas. Tenho certeza que muitos de vocês, assim como eu, quando eu vi a interface pela primeira vez, eu pensei: esse negócio não serve pra nada! O que eu vou fazer com pedaço de código no qual eu não consigo colocar lógica nenhuma, que eu só coloco uns métodos vazios? Pra que que esse negócio serve? Isso aí não serve pra nada. Então, confesso pra vocês que a primeira vez que eu vi esse negócio de interface não entendi para o que servia. Só que pensar assim você está muito errado. O uso de interfaces ele é fundamental, ele é muito importante para você conseguir a reutilização na orientação a objetos. E eu vou mostrar pra vocês exemplo que eu acho que deixa isso bem claro. É exemplo real inclusive com classes da própria biblioteca do Java. Imagine o seguinte: que você queira implementar algoritmo de ordenação, que você queira ordenar listas de objetos. Esse método existe na classe collections, você pode chamar collections.sort, pra ele fazer essa organização, e você pode passar uma lista de objetos como parâmetro pra este objeto. Só que existem várias coisas que podem ser ordenadas... Por exemplo, você pode ordenar strings ordem alfabética, você pode ordenar números. Por exemplo: às vezes você está lendo uma lista, por exemplo, de compras e você quer ordenar ordem de qual a compra foi maior, por exemplo. Ou seja, ordenando por números. Você pode ordenar datas, por exemplo, você quer botar as pessoas na ordem de nascimento, das mais novas às mais velhas ou o contrário. Só que não é só isso que você pode ordenar. Às vezes você quer ordenar uma coisa da sua aplicação que tem uma lógica bem específica do seu negócio. Por exemplo, imagine que você está fazendo software que organize, que ordene ordem de classificação os candidatos de concurso. Então vai falar assim: tá certo, eu vou calcular a média deles de acordo com esses pesos, e aí quem tiver a nota maior fica na frente. Mas se a nota empatar, normalmente tem uma prova específica que serve como desempate. E se mesmo assim as coisas forem empatando de repente você tem critério de desempate que, por exemplo, alguém que tenha uma deficiência vai ser colocado na frente ou alguém que tenha idade maior também vai ser colocado na frente. Então tem esses critérios de desempate que é uma lógica toda complicada. Pegue aí o edital de concurso que você vai ver que a ordenação dos candidatos, principalmente quando empatam nos pontos, não é nem pouco trivial... Às vezes, por exemplo, você tem ali uma lista de investimentos e você quer ordená-los para descobrir qual que tem o menor risco. De repente até você quer maximizar o seu ganho com o menor risco possível. Também não é uma ordenação trivial, como que você calcula esse risco. Às vezes várias informações podem estar ligadas a isso. Às vezes você tem, por exemplo, você quer fazer ranking de jogadores pela pontuação, mas de repente você vai considerar por exemplo, de repente você vai valorizar mais os pontos que eles conseguiram no último mês. Então, pra estimular os jogadores a jogarem... Então você pode precisar fazer ordenações que tenham lógicas extremamente complicadas e extremamente específicas. Aí você falar assim: mas como que método lá do Java Collections.Sort, como que método desses vai saber ordenar os meus objetos por critério extremamente específico? Será que consigo reutilizar esse método Sort para isso? A gente vai ver que com o uso de interfaces a gente consegue, sim. Por quê? Porque o algoritmo é o mesmo. O objeto só tem que me dizer, a partir de momento que eu chego e falo assim: olha, eu tenho objeto A e objeto B, qual é o maior? Qual vem na frente? Se o meu objeto conseguir me dizer isso, ele pode ter uma lógica extremamente complicada interna ali, que, de repente, o meu método que está fazendo a ordenação não precisa saber. Então, eu posso definir esse contrato de comparação a partir de uma interface. E note que esses objetos que eu citei aqui no slide anterior são de classes que talvez tenham sua própria hierarquia. O fato de ser uma interface permite que eles possam ser comparable, que eles possam implementar comparable, independente de terem uma hierarquia que não tem nada a ver com isso. A aplicação pode ter sua hierarquia e suas classes. E aquela classe pode implementar a interface. Então essa interface, como eu falei, é exemplo real, ela realmente existe na biblioteca básica do Java, que é a interface Comparable. Se você implementa essa interface Comparable, você tem que implementar esse método CompareTo, onde você passa objeto e ele te retorna inteiro positivo, negativo ou zero, que vai significar se é maior ou menor. Então o método do sort recebe uma lista de Comparables. Então, pode ser lista de qualquer objeto, desde que tenha essa interface Comparable. E aí todos aqueles meus objetos, sejam eles uma String, Date ou qualquer número ou integer, dado da máquina virtual, tanto como a classe candidato, a classe jogador, a classe investimento ou qualquer outra classe que eu queira ordenar. Desde que eles implementem Comparable, a lista de qualquer deles pode ser passada por método sort, porque o método sort vai saber fazer uma ordenação. Por quê? Porque ele não depende da classe. Ele depende da interface que essa classe implementa. Então a partir daquele momento ele fala assim: olha, só me passe classes que tenham esse contrato Comparable. E se a sua classe tem isso, você pode reutilizar aquele método, olha que negócio bacana, você pode pegar a sua classe que você acabou de criar e passar ela para método que foi criado há muito tempo atrás por pessoas que você nem sabe, e esse método vai usar a sua classe, ele vai saber usar a sua classe. E tudo isso só é possível por causa das interfaces. Se você perguntar para o método sort: você conhece essa classe? "Não conheço, não." Agora se perguntar: mas você conhece a interface dessa classe, você conhece o contrato dessa classe? " esse eu conheço!" Pra mim, isso é o suficiente. O reuso de código na orientação a objeto está ligado ao fato de que o código não precisa ser feito especificamente para a sua classe. E você consegue criar códigos que conseguem ser utilizados para classes que nem foram criadas ainda. Como que eu consigo fazer isso? Criando códigos que são feitos para o contrato. Vez de eles serem feitos para uma classe específica, são códigos feitos para as interfaces. Então eu espero que com esse exemplo tenha ficado mais claro pra todo mundo como que essas interfaces são importantes. Como que é interessante você conseguir criar o seu código baseado nessas interfaces. E de forma que esse código possa ser reutilizado pra outras classes que você não conhece, que você não previu, certo, desde que eles mantenham aquele contrato para o qual você criou aquele código. Então espero que essa ideia tenha ficado mais clara pra vocês nessa aula. Até a próxima aula. [MÚSICA]