2
votes

Interface Java 9: ​​Pourquoi le modificateur par défaut est-il converti en modificateur public

Ma question concerne l ' interface . Je crée une interface et définit quatre méthodes: la première méthode est une méthode privée ; la seconde est une méthode default ; la troisième est une méthode statique ; et la quatrième est une méthode abstraite .
Après avoir compilé cette interface et vérifié son profil: la méthode default est convertie en une méthode publique , et à la fois le static et le abstract ont un modificateur public ajouté. Pourquoi?

Code:

    D:\Linux\IDE\Workspace\OCA-Wrokspace\Ocaexam\src>javap mods\com\doubt\session\InterfaceProfile.class
Compiled from "InterfaceProfile.java"
interface com.doubt.session.InterfaceProfile {
  public void defaultM();
  public static void staticM();
  public abstract void doStuff();
}

Classe InterfaceProfile

 interface InterfaceProfile {

    private void privateM() {   //this method is hidden
        System.out.println("private Method");
    }

    default void defaultM() {
        System.out.println("Default Method");
    }

    static void staticM() {
        System.out.println("Static Method");
    }

    void doStuff(); //by default adds the public modifier
}


2 commentaires

AFAIK, Java 9 a introduit des méthodes d'interface privée.


en fait j'utilise openjdk 12


4 Réponses :


4
votes

Le fait qu'il s'agisse d'une méthode default ne fait aucune différence. La portée implicite est public .

Voici ce que le tutoriel dit:

Toutes les méthodes abstraites, par défaut et statiques d'une interface sont implicitement publiques, vous pouvez donc omettre le modificateur public.


1 commentaires

@GhostCat Bon point :-) Je crois cependant que le JLS est parfois écrasant pour certains niveaux de questions (le niveau de réponses de qualité acceptable serait trop sévère si toutes les réponses devaient être mesurées comme ça). Cela dit, vous avez un point très valable - en supposant des implémentations sans bogue de la spécification du langage ;-)



1
votes

Le modificateur par défaut est public, car c'est ainsi que la déclaration d'interface est définie: https://docs.oracle.com/javase/tutorial/java/ IandI / interfaceDef.html

Si vous demandez le raisonnement derrière cela, je dirais que le but de la définition d'une interface est d'assurer l'interface - bien - de toutes les classes d'implémentation, ce qui signifie que toutes les classes d'implémentation ont des contrats clairs sur lesquels les méthodes accessibles besoin de fournir.

L'ajout de méthodes privées à une interface ne sert pas cet objectif principal et semble être davantage un indice d'implémentation. Les méthodes privées et abstraites ont été des ajouts tardifs aux interfaces.

En relation: Les méthodes d'une interface Java doivent-elles être déclarées avec ou sans modificateur d'accès public?


2 commentaires

" Les méthodes privées et abstraites étaient des ajouts tardifs aux interfaces. " Vous ne vouliez sûrement pas dire abstract ici, comme avant Java 8, les interfaces n'avaient que des abstract méthodes.


@Holger: Vous avez raison. Ce que je voulais dire, c'est que les interfaces peuvent désormais également déclarer des méthodes implémentées similaires aux classes abstraites.



2
votes

Simple: par défaut, toutes les méthodes d'une interface sont publiques . Vous pouvez restreindre cela en appliquant private , mais chaque fois que vous ne le faites pas, cette valeur par défaut entre en jeu. Ainsi: il n'y a aucune conversion en cours du tout.

Citant la Spécification du langage Java :

Une méthode dans le corps d'une interface peut être déclarée publique ou privée (§6.6). Si aucun modificateur d'accès n'est donné, la méthode est implicitement publique. Il est permis, mais déconseillé par souci de style, de spécifier de manière redondante le modificateur public pour une déclaration de méthode dans une interface.

(la possibilité d'avoir des méthodes privées dans les interfaces a été introduite avec Java 9, car les gens ont découvert que les méthodes par défaut de Java 8 créaient souvent le besoin d'avoir, eh bien, des méthodes privées que ces méthodes par défaut pourraient utiliser, sans faire de ces méthodes visibles publiquement)


0 commentaires

1
votes

https://docs.oracle.com/javase/tutorial /java/IandI/interfaceDef.html

Toutes les méthodes abstraites, par défaut et statiques d'une interface sont implicitement publiques, vous pouvez donc omettre le modificateur public.

En effet, une classe qui implémente une interface expose toutes les méthodes d'interface (autres que private) à tout autre code ayant une visibilité de la classe.

Ce serait très déroutant si une classe avait une interface mais que les méthodes de l'interface seraient visibles pour certains codes et pas pour d'autres. Si vous souhaitez exposer sélectivement des méthodes, vous devriez probablement utiliser plusieurs interfaces.

public interface Profile {
    generalMethod() ...
}
public interface SecretProfile extends Profile {
    secretMethod() ...
}

Les classes peuvent choisir d'implémenter l'une des interfaces (ou même les deux). Le code tiers peut vérifier la présence de l'interface et savoir que la méthode est disponible ou non.


0 commentaires