Oui, vous peut créer à la fois une classe imbriquée ou une classe interne à l'intérieur d'une interface Java (notez que contrairement à la croyance populaire, il n'y a pas une telle chose comme une « classe interne statique »: cela n'a aucun sens, il n'y a rien de "interne" et pas de "externe" quand une classe imbriquée est statique, donc elle ne peut pas être "statique interne").
Quoi qu'il en soit, ce qui suit compile bien:
public interface A {
class B {
}
}
Je l'ai vu utilisé pour mettre une sorte de « vérificateur de contrat » directement dans la définition d'interface (bien, dans la classe imbriquée dans l'interface, que peut avoir des méthodes statiques, contrairement à l'interface elle-même, qui ne peut pas). Cela ressemble à ceci si je me souviens bien.
public interface A {
static class B {
public static boolean verifyState(A a) {
return (true if object implementing class A looks to be in a valid state)
}
}
}
Notez que je ne suis pas de commentaires sur l'utilité d'une telle chose, je suis tout simplement répondre à votre question: il peut être fait et c'est un type d'utilisation que j'ai vu fait.
Maintenant, je ne commenterai pas l'utilité d'une telle construction et de je l'ai vu: Je l'ai vu, mais ce n'est pas une construction très courante. Codebase ici où cela arrive exactement zéro temps (mais nous avons beaucoup d'autres choses que nous considérons les mauvaises pratiques qui se produisent exactement à zéro heure que d'autres personnes trouveraient parfaitement normal alors ...).
Pouvez-vous ajouter quelques exemples d'utilisation? J'ai testé quelque chose de similaire il y a quelque temps et je n'ai pas compris ce que je pourrais gagner en utilisant cette construction. – Roman
@Roman: eh bien je me souviens d'avoir rencontré ça sur un projet (un projet relativement propre ajouterais-je mais qui n'était pas le mien) mais je ne sais pas si c'est vraiment propre ou pas. J'ai ajouté un petit exemple qui ressemble à ce que j'ai vu mais encore une fois: ce n'était pas mon code et je n'utilise pas cette construction donc je ne suis pas le plus qualifié pour trouver des exemples valides :) IIRC la classe à l'intérieur était toujours nommée, par exemple * StateChecker * et les appels ressembleraient toujours à: * A.StateChecker.check (a) * ou quelque chose comme ça. – SyntaxT3rr0r
Si vous dites "il n'y a pas de" classe interne statique * "" votre réponse que "vous * pouvez * créer à la fois une classe imbriquée ou une classe interne dans une interface Java" est fondamentalement fausse. En utilisant votre définition rétrécie, 'interface's ne peut * pas * avoir de classes internes. Vous pouvez omettre le modificateur 'static' de la classe imbriquée d'une' interface' mais c'est quand même une classe imbriquée, pas une classe interne. – Holger