web-dev-qa-db-fra.com

Y a-t-il quelque chose comme une classe interne en Java?

En C #, vous pouvez marquer une classe avec internal afin qu'elle ne soit accessible que depuis le même package. Y a-t-il quelque chose de similaire en Java?

38
Svish

Vous pouvez créer des classes paquet-privées en omettant le modificateur de sécurité (public, privé) de la déclaration de la classe.

package com.sample;

class MyPackagePrivateClass
{
    ...
}
53
Bryan Kyle

L'abandon du modificateur d'accès est similaire à interne en C #.

C #

public class A
{
    public static int X;
    internal static int Y;
    private static int Z;
}
internal class B
{
    public static int X;
    internal static int Y;
    private static int Z;
    public class C
    {
        public static int X;
        internal static int Y;
        private static int Z;
    }
    private class D
    {
        public static int X;
        internal static int Y;
        private static int Z;
    }
}

Java

public class A
{
    public static int X;
    static int Y;
    private static int Z;
}
class B
{
    public static int X;
    static int Y;
    private static int Z;
    public class C
    {
        public static int X;
        static int Y;
        private static int Z;
    }
    private class D
    {
        public static int X;
        static int Y;
        private static int Z;
    }
}

Source: http://www.javacamp.org/javavscsharp/internal.html

8
Steven Jeuris

cette question a déjà été acceptée, mais je pense que la réponse n’est pas tout à fait claire pour les nouveaux venus en Java venant de .Net.

Est-ce que Java a un équivalent exact pour le modificateur interne en C #? réponse courte est NON (mais vous pouvez y arriver un peu et comment je vais le dire) !!

internal en C # est en fait un modificateur "Assembly-private". qu'est-ce qu'une assemblée?

L’assemblage est n’importe quel produit de votre projet (DLL ou EXE en C # - l’équivalent en Java peut être un fichier JAR)

il n'y a pas d'équivalent exact pour interne en Java. et ce qui a été répondu par Bryan Kyle et accepté est en fait "paquet-privé" (les paquets en Java sont équivalents aux espaces de noms en C #), mais certains comment ce qui a été répondu est le moyen le plus proche d’obtenir le même résultat.

MAIS comment obtenir un résultat totalement identique à interne? Java n'a-t-il pas une solution à cela? la réponse est oui.

il a. mais pas avec un modificateur. En fait, le meilleur moyen de le faire est de garder un secret dans l’emballage. La meilleure pratique d’emballage est d’emballer vos classes par leur relation et non par leur type.

beaucoup d'entre nous utilisent des paquets nommés "Modèles" ou "Présentateurs" et y mettent tous nos modèles ou présentateurs. alors que c'est tellement faux. les paquets devraient être comme "Livre" contenant "BookModel.Java", "BookPresenter.Java", .....

de cette façon, vous pouvez les rendre paquet-privé en omettant le modificateur et vous ne rencontrez aucun problème car vous pouvez y accéder dans toutes les classes qui ont besoin de votre classe package-private car vous avez une bonne pratique d'empaquetage.

5
Amir Ziarati

Je ne suis pas familier avec C #, mais en Java, la protection par défaut est que quelque chose est uniquement accessible dans le paquet:

public = accessible par n'importe qui

private = accessible uniquement dans la classe en cours

protected = accessible dans le package ou dans toute classe qui hérite de la classe actuelle

default = accessible dans le package

J'ai toujours pensé qu'il devrait y avoir un moyen de dire "accessible par n'importe quelle classe qui hérite de la classe actuelle mais pas de n'importe où ailleurs, ce paquet ou tout autre". Mais il n'y en a pas.

1
Jay

Oui. Cela s'appelle package private, vous définissez simplement la classe sans aucun modificateur: 

package com.blah; class Foo{ }

1
Steven Fines

Vous pouvez créer un package de classe local. C'est la portée par défaut d'une classe. c'est-à-dire où vous n'avez pas de modificateurs d'accès.

Si vous voulez vraiment mettre un jour, vous pouvez créer une annotation, par exemple. @package_local, je le fais dans des endroits où je veux vraiment que ce soit un paquet local et que je ne l'ai pas laissé non spécifié.

0
Peter Lawrey

Oui, le niveau d'accès par défaut (paquet privé). Laissez simplement n'importe quel modificateur d'accès dans votre définition de classe et vous obtiendrez ce que vous voulez.

0
jarnbjo