Есть ли что-то вроде внутреннего класса в Java? - PullRequest
38 голосов
/ 12 мая 2011

В C # вы можете пометить класс как internal, чтобы он был доступен только из одного пакета. Есть ли что-нибудь подобное в Java?

Ответы [ 7 ]

55 голосов
/ 12 мая 2011

Вы можете создавать закрытые для пакета классы, опуская модификатор безопасности (public, private) из объявления класса.

package com.sample;

class MyPackagePrivateClass
{
    ...
}
8 голосов
/ 12 мая 2011

Отбрасывание модификатора доступа аналогично внутреннему в 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;
    }
}

Источник: http://www.javacamp.org/javavscsharp/internal.html

5 голосов
/ 05 ноября 2016

на этот Вопрос уже был принят ответ, но я думаю, что этот ответ не совсем понятен для новичка в Java, пришедшего из .Net.

Есть ли в Java точный эквивалент внутреннего модификатора в C #? краткий ответ - НЕТ (но вы можете добиться этого как-нибудь, и я скажу) !!

internal в C # на самом деле является модификатором "частная сборка". что такое сборка?

Сборка - это любой продукт вашего проекта (DLL или EXE в C # - эквивалент в java может быть файлом JAR)

В Java нет точного эквивалента для internal. и то, что ответил Брайан Кайл и принял, на самом деле является «частным пакетом» (пакеты в java эквивалентны пространствам имен в C #), но кое-что из того, что было получено, является самым близким способом получить тот же результат.

НО как получить полностью такой же результат, как и внутренний? не может Java иметь решение для этого? ответ ДА.

это имеет. но не с модификатором. На самом деле лучший способ сделать это - секрет в упаковке. Лучшая практика упаковки - это упаковать ваши классы по их родству, а не по их типу.

многие из нас используют пакеты с именами «Модели» или «Презентаторы» и помещают в них все наши модели или презентаторы. пока это чертовски неправильно. пакеты должны быть как «Book», содержащие «BookModel.java», «BookPresenter.java», .....

таким образом, вы можете сделать их закрытыми для пакета, не используя модификатор, и у вас не возникнет никаких проблем, потому что вы можете получить к ним доступ в любом классе, который нуждается в вашем классе закрытого пакета, потому что у вас есть хорошая практика упаковки.

1 голос
/ 12 мая 2011

Я не знаком с C #, но в Java защита по умолчанию заключается в том, что что-то доступно только внутри пакета:

публично = доступно любому

private = доступно только внутри текущего класса

protected = доступный в пакете или в любом классе, который наследует от текущего класса

по умолчанию = доступно в пакете

Я всегда думал, что должен быть способ сказать «доступный любому классу, который наследует от текущего класса, но не от кого-либо еще, от этого пакета или любого другого». Но нет.

1 голос
/ 12 мая 2011

Да.Он называется package private, вы просто определяете класс без модификаторов:

package com.blah; class Foo{ }

0 голосов
/ 12 мая 2011

Да, уровень доступа по умолчанию (частный пакет).Просто оставьте любой модификатор доступа в вашем определении класса, и вы получите то, что хотите.

0 голосов
/ 12 мая 2011

Вы можете сделать пакет класса локальным. Это область действия по умолчанию для класса. то есть там, где у вас нет модификаторов доступа.

Если вы действительно хотите добавить время, вы можете создать аннотацию, например, @package_local, я делаю это в тех местах, где я хочу, чтобы это был локальный пакет, а не просто не указывал его.

...