2017-09-18 1 views
15

Le Modifier for Exports dans le doc java indique queQuelle est la différence entre synthétique et Mandaté Modificateur Java9

MANDATED L'exportation a été implicitement déclaré dans la source du module déclaration. L'exportation n'a pas été déclarée explicitement ou implicitement dans la source de la déclaration du module.

En regardant quelques module-info.class es, je peux voir qu'il ya généralement deux types d'usages:

module java.base { 
    ... 
    exports java.util; // type 1 
    exports java.util.concurrent; 
    exports java.util.concurrent.atomic; 
    exports jdk.internal to jdk.jfr; // type 2 
    exports jdk.internal.jmod to 
     jdk.compiler, 
     jdk.jlink; 
    ... 
} 

Le Qualified Exports ne décrivent ces deux types, mais il n'y a pas de référence aux types de ENUM. Sont-ce les différents types mentionnés dans les documents?

Q1. En général, SYNTHETIC et MANDATED sont des modificateurs utilisés comme dans Exports, ModuleDescriptor, Opens et Requires. Quelle est la différence entre ces deux et est un préféré à un autre dans la pratique?

Q2. Quel est un exemple d'un SyntheticModifier de toute façon sinon déclaré dans la source du module?

+2

N'êtes-vous pas une réponse à ces questions? ;-) – GhostCat

+0

@GhostCat Haha..Je devrais essayer fort pour celui-ci je suppose.Juste ne pouvait pas trouver une référence simple n'importe où. Je comptais sur la communauté pour revenir avec quelques/meilleurs détails :) – nullpointer

+1

Attendons qu'Alan réponde à cela mais je suppose que les exports synthétiques pourraient être ceux qui sont créés pour les modules automatiques et ceux sans nom. De tels modules exportent des paquets même s'ils ne déclarent pas une clause 'exports'. Mais je ne fais que deviner ici ... – Nicolai

Répondre

1

La différence entre les modificateurs synthétique et mandaté est simple - le mandat a été implicitement déclaré et synthétique n'a pas été implicitement ou explicitement déclaré. Il y avait de bons articles sur cela et la spécification Java a une explication détaillée sur le modificateur synthétique qui a été précédemment introduit dans Java. Ci-dessous les détails liés au synthétique ont été extraits de ceux-ci en raison de l'exhaustivité des détails. Veuillez trouver les références à la fin.

synthétique:

L'attribut synthétique est un attribut de longueur fixe dans les attributs table d'un ClassFile, field_info, ou structure de method_info (§4.1, §4.5, §4.6). Un membre de classe qui n'apparaît pas dans le code source doit être marqué à l'aide d'un attribut Synthetic ou bien son indicateur ACC_SYNTHETIC doit être défini. Les seules exceptions à cette exigence sont méthodes générées par compilateur qui ne sont pas considérées comme des artefacts , à savoir la méthode d'initialisation d'instance représentant un constructeur par défaut du langage de programmation Java (§2.9), la méthode d'initialisation de classe (§2.9), et les méthodes Enum.values ​​() et Enum.valueOf() . Les classes, méthodes et champs synthétiques Java sont destinés à java . Nous n'avons pas besoin d'avoir des connaissances sur pour écrire le code.

L'attribut synthétique a été introduit dans la version 1.1 de JDK pour prendre en charge classes imbriquées et interfaces.

L'attribut synthétique a le format suivant:

Synthetic_attribute { 
    u2 attribute_name_index; 
    u4 attribute_length; 
} 

Les éléments de la structure Synthetic_attribute sont les suivantes:

attribute_name_index La valeur de l'élément attribute_name_index doit être un index valide dans la table constant_pool . L'entrée constant_pool à cet index doit être une structure CONSTANT_Utf8_info (§4.4.7) représentant la chaîne "Synthetic".

attribute_length La valeur de l'élément attribute_length est zéro. Utilise de Java Synthetic • Il peut être utile dans les sessions de débogage, quand nous voyons ces trucs synthétiques dans la trace de la pile, nous pouvons comprendre ce que c'est. • AOP, génériques, enums utilise Java synthétique. • API de réflexion Java expose une méthode pour vérifier si un élément est synthétique. • Un programmeur d'application java ne nécessitera pas de programmation synthétique pour la programmation quotidienne . • Cette connaissance peut être requise dans les entretiens mais ne stipule pas que vous l'utiliserez dans le projet. Lorsque synthétique est créé? Lorsqu'une classe englobante accède à un attribut privé d'une classe imbriquée , le compilateur Java crée une méthode synthétique pour cet attribut . S'il existe une méthode getter disponible dans la source, cette méthode synthétique ne sera pas créée. De même pour le constructeur de classes internes aussi synthétique est créé. Il y a beaucoup d'occasions, comme ceci où un champ synthétique ou une méthode ou une classe est créée.

mandat:

Le paquet ouvre a été implicitement déclaré dans la source du module déclaration. Cette dépendance a été déclarée dans la déclaration du module. Une construction mandatée est celle qui n'est pas explicitement déclarée dans le code source , mais dont la présence est prescrite par la spécification. Une telle construction est dite implicitement déclarée. Un exemple d'élément obligatoire est un constructeur par défaut dans une classe qui ne contient aucune déclaration de constructeur explicite . Un autre exemple de construction obligatoire est une annotation de conteneur implicitement déclarée utilisée pour contenir annotations multiples d'un type d'annotation répétable. Ex:

Module claim 
requires mandated java.base 

Ligne 1. Définit le module appelé claim. Dans la ligne 2 définit chaque module dépend du module java.base sauf java.base. Cela signifie que l'exportation a été implicitement déclarée dans la déclaration du module source.

Références:

+0

Hey! Bienvenue à stackoverflow et merci d'avoir déployé autant d'efforts pour y répondre. Petite demande, pourriez-vous lier le document que vous avez abordé et améliorer le formatage de la réponse? Cela augmenterait sa lisibilité. – nullpointer