A partir do Java 8, os default
métodos foram introduzidos nas interfaces. Efetivamente, isso significa que nem todos os métodos em um interface
são abstract
.
A partir do Java 9 (talvez), os private
métodos serão permitidos. Isso significa que nem todos os métodos em um interface
são public abstract
.
A pergunta "Os métodos em uma interface Java devem ser declarados com ou sem o public
modificador de acesso?" foi solicitado no Stack Overflow em /programming/161633/should-methods-in-a-java-interface-be-declared-with-or-without-a-public-access-m
Lá, a maioria das respostas argumentou que public abstract
não deveria ser usado porque nenhum método em um interface
pode ser outra coisa senão public abstract
. Esse não é mais o caso.
Portanto, à luz desses novos recursos de interfaces, as public abstract
palavras - chave devem ser usadas em uma declaração de método de interface Java?
No meu ambiente específico, teremos pessoas que são engenheiros de software experientes, mas não experientes em Java, lendo o código Java de tempos em tempos. Sinto que deixar de fora as public abstract
palavras - chave criará um ponto de confusão adicional para aqueles que não estão familiarizados com o histórico de como as interfaces passaram a ter regras diferentes para o uso dessas palavras-chave.
fonte
default
modificador oustatic
modificador é implicitamenteabstract
... É permitido, mas desencorajado por uma questão de estilo, a especificar redundantemente oabstract
modificador para uma declaração desse método ". Por que você espera que as coisas mudem?abstract
está se tornando cada vez mais complicada. Em Java 9, a mesma frase poderia ser: "Um método de interface sem umdefault
modificador ou umstatic
modificador ou umprivate
modificador é implicitamente abstract ..." Além disso, os argumentos auxiliares para não usar explicitamente as palavras-chave, ou seja, que todos os métodos de interface sãopublic abstract
, agora são discutíveis.stream
ajava.util.Collection
ouMap.getOrDefault()
. Alternativa é criar uma nova sub-interface, e fazer com que todo mundo faça downcast, como o Graphics2D, e ninguém gostou disso!Respostas:
Para expandir a resposta do StackOverflow:
O
public
modificador de acesso não é necessário porqueO
abstract
modificador de acesso não é necessário porqueE...
Dado que os métodos padrão têm um corpo, e os que não são inerentemente abstratos, e toda declaração de método em uma interface é inerentemente pública, você não precisa especificar nenhuma das palavras-chave.
Um dos comentários em uma resposta dizia:
Um comentário sobre a questão StackOverflow (votada 18 vezes mais) refuta isso:
As implicações do código, especialmente as interfaces, são importantes.
fonte
A falta de uma declaração de bloco não é suficiente? Você declararia,
extends Object
embora implícito?Se o desenvolvedor não entender a redundância, é provável que ele não entenda completamente o conceito por trás do recurso de linguagem , o que é um problema ainda maior do que ficar confuso com os modificadores.
O desenvolvedor deve entender que o objetivo de uma interface é criar um contrato que defina como um cliente pode interagir com um objeto. Isso sugere que qualquer método em uma interface usada para interação com objetos deve ser exposto aos clientes.
Se você declarar um método privado, estará explicitamente declarando que o método não deve ser chamado pelos clientes, o que no caso de interfaces é algo que não pode ser facilmente deduzido.
fonte
public abstract
antes, apesar do estilo policial, porque deixava as coisas claras e lembrava o leitor. Agora estou justificado porque o Java 8 e 9 complica as coisas :-). Java já é bastante redundante.extends Object
a todas as classes que derivam diretamenteObject
? São informações de que um desenvolvedor já deve estar ciente, e é por isso que é inferido. Quanto menos informações inúteis na tela, mais fácil é processar as informações importantes. Espero ter convencido você a vir para o lado sombrio (entendeu? Porque coisas implícitas não podem ser vistas). Se não, valeu a pena um tiro haha. No final, tudo se resume ao que torna o código mais fácil de gerir para o desenvolvedorfinal
antes de argumentos de método, a menos que algo engraçado exige isso (como uma classe interna anônima etc ...)extends Object
, mas definitivamente levantaria uma bandeira e me faria questionar o porquê. Como eu mencionei no post, fazer tais coisas poderia implicar que o desenvolvedor pode ter um mal-entendido de como funciona alguma coisa (pode não saber que todos os objetos já estendemObject
, daí a extensão explícito)