Final de l'interface en Java?
Une interface être déclarée final en Java?
- Pourquoi ne pas essayer? Type
public final interface MyInterface {}
et voir si ça compile. - Qu'attendez-vous d'une interface finale?
- Peut-être qu'il attend une "interface finale" à être mises en œuvre (classe
implements
interface), mais pas extensible (interfaceextends
interface). Seulement deviner.
Vous devez vous connecter pour publier un commentaire.
Interfaces sont 100% abstrait, et le seul moyen de créer une instance de l'interface est d'instancier une classe qui l'implémente. Permettant les interfaces
final
est complètement inutile.MODIFIER La questions n'est pas aussi carrément scandaleux que je ne le pensais. Une interface finale est celle qui ne peut pas être prolongé par d'autres interfaces, mais peut être mis en œuvre en apparence, fait sens.
Je pouvais penser a une différence entre une classe finale et une finale de l'interface. Extension d'une classe peut compromettre son intégrité, car il contient de l'état. Extension d'une interface ajoute simplement des opérations et ne peuvent pas compromettre l'intégrité de la mise en œuvre parce que l'interface est apatrides sur son propre.
Pas. En essayant de déclarer une interface comme final en Java provoque une erreur de compilation. C'est un langage de conception de la prise de Java interfaces sont conçus pour être extensible.
Pas. Le Langage Java Specification section 9.1.1. Interface Modificateurs les états suivants:
Comme on peut le voir, la liste ne comprend pas
final
.Pourquoi le langage conçu de cette façon?
Si une interface a été déclaré
final
je suppose qu'il aurait pu signifier queAucune autre interface pourrait l'étendre
Ce serait un non-sens de la restriction. Les raisons pour lesquelles il peut être utile de déclarer un classe final, est de protéger l'état des invariants, d'interdire primordial de toutes les méthodes à la fois, etc. Aucune de ces restrictions de sens que pour les interfaces. (Il n'y a pas d'état, et toutes les méthodes doit être remplacé.)
Pas de classe peut implémenter l'interface
Évidemment, défaites le but d'une interface complètement.
De la Java Language Specification (Troisième Édition):
Donc,
abstract
+final
est une sorte d'oxymore.class
? Ils parlentinterface
. De même, mon compilateur dit MyClass peut êtreabstract
oufinal
, pas les deux.Je l'ai essayé et apparemment, vous pouvez créer une interface finale en java. Je n'ai aucune idée de pourquoi vous voulez faire cela, mais vous pouvez. C'est la façon dont je l'ai fait.
Compiler un non définitif de l'interface. J'ai sauvé le code ci-dessous dans FinalInterface.java. Puis j'ai compilé.
interface FinalInterface
{
}
Exécuter BCELifier sur elle. Cela a créé un fichier appelé FinalInterfaceCreator.java
De le modifier. Recherchez une ligne similaire à ci-dessous et ajouter ACC_FINAL.
_cg = new ClassGen("FinalInterface", "java.lang.Objet", "FinalInterface.java", ACC_INTERFACE | ACC_ABSTRACT | ACC_FINAL , new String[] { });
Compiler et exécuter le fichier FinalInterfaceCreator.java. Cela devrait remplacer l'original FinalInterface.class fichier avec un nouveau qui est similaire, mais la finale.
Pour le tester, j'ai créé deux nouveaux fichiers java TestInterface et TestClass. TestInterface est une interface qui étend FinalInterface et TestClass est une classe qui implémente FinalInterface. Le compilateur refuse de compiler soit parce que FinalInterface est définitive.
En plus, j'ai essayé de créer une instance de FinalInterface en utilisant des proxies dynamiques
Ce un compilé, mais n'a pas couru
Ainsi, la preuve suggère que vous pouvez créer une interface finale en java, mais pourquoi voudriez-vous?
Tandis qu'une interface finale aurait encore utilise, aucun d'entre eux sont largement considéré comme une bonne pratique.
Une interface finale pourrait être utilisé pour
considérée comme une mauvaise idée.
suggérer ce qui est utilisé lorsque
les couper et coller un exemple de code
qui a beaucoup de classes car il permet d'économiser
vous les tracas de la création d'un fichier pour chaque classe,
les classes internes sont implicitement statique)
Vous pouvez faire toutes ces choses avec un non-interface finale et le marquage d'une interface finale ne serait pas aussi utile comme commentaire saysing vous utilisez une interface pour un incedental but et pourquoi vous le faites
Lors de la conception d'Api dans Java je trouve parfois dans une situation où un type dans l'API doit être Java interface, mais le nombre de sa mise en application devrait être limitée, par exemple, seule l'Api internes de la mettre en oeuvre, pas quelqu'un d'autre.
J'ai réalisé que je peux maintenant (depuis Java 1.6) restreindre qui implémente une interface avec l'aide de l'annotation processors (l'article sur apidesign.org). C'est le code:
Chaque fois que quelqu'un comprend votre API JAR au classpath et essaie de compiler contre elle, la Javac compilateur appelle votre processeur d'annotation et de l'échec de la compilation si il détecte quelqu'un d'autre est en train d'essayer de mettre en œuvre votre interface.
Je préfère encore l'utilisation de classe finale pour Client API - p. ex. un API que d'autres sont seulement autorisés à appeler, mais quand il n'est pas possible, le truc avec processeur d'annotation est solution de rechange acceptable.
-proc:none
option de ligne de commande, et vous n'avez plus à faire respecter la limitation... je préfère faire la classe package privé et sceller l'emballage...finale signifie qu'il ne peut pas être modifié. Si c'est une classe, il ne peut pas être modifié par l'extension (méthodes peuvent être modifiés par substitution, l'attribut ne peut pas être modifié; ajout d'attributs/méthodes ne peuvent être accessibles que les membres de la sous-classe de type'); si ses une variable (attribut/local), puis la valeur ne peut pas être modifié après la première affectation; si sa méthode, la mise en œuvre ne peut pas être modifié (une dernière méthode peut être surchargé, mais ne peut pas être remplacée). Il n'y pas de point dans la déclaration d'une interface finale car il n'y a normalement pas de mise en œuvre de modifier (par défaut, et statique de l'interface des méthodes ne sont pas autorisés à être final).
Au lieu de Déclarer l'Interface Finale, Nous pouvons éviter de Créer un objet de l'Interface.
Point de Création d'Interface met en œuvre ses méthodes par sa sous-classe. Si nous voulons vaincre cet effet, puis je sens sa une sans fondement.
Si quelqu'un a d'autres suggestions, merci de nous le faire savoir
Chaque fois que vous créez une annotation de la création d'une interface qui est en quelque sorte de manière efficace final.