Есть ли что-то вроде внутреннего класса в Java?

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


person Svish    schedule 12.05.2011    source источник
comment
Возможный дубликат stackoverflow.com/questions/2534733/java-protected-classes   -  person pintxo    schedule 12.05.2011
comment
@cmmi: На самом деле это не дубликат, поскольку вопрос задается с совершенно другой точки зрения. Тот же ответ, хотя.   -  person Steven Jeuris    schedule 12.05.2011
comment
Обратите внимание, что в C# нет packages. У них есть namespaces и assemblies. Пакеты эквивалентны пространствам имен. Но сборки можно сравнить с файлами JAR в Java. Модификатор internal делает класс доступным только внутри сборки. Таким образом, он не имеет ничего общего с пространствами имен или пакетами.   -  person nedR    schedule 05.02.2014


Ответы (7)


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

package com.sample;

class MyPackagePrivateClass
{
    ...
}
person Bryan Kyle    schedule 12.05.2011
comment
пакет лучше инкапсулирует, чем сборка - person hB0; 22.10.2013
comment
@hB0: Ни за что! Как бы вы объявили внутренний вспомогательный класс, на который ссылаются в разных пакетах? Вы просто не можете - person Lotfi; 08.01.2014
comment
Я имел в виду лучший способ разработки программного обеспечения, а не более интенсивный (который всегда поставляется с MS). - person hB0; 08.01.2014
comment
Хотя я согласен, что пакет - это определение, далекое от пространства имен, программирование нескольких частей библиотеки классов, что может несколько показаться странным, когда классы должны вызывать друг друга, но вы не хотите, чтобы они были доступны извне этой библиотеки И тогда, если вы хотите добиться этого, вы не можете иметь эти классы в отдельных пакетах. Возможно, создать внутренний пакет, для классов, используемых только собственной библиотекой, возможно, будет самым безопасным выходом. - person Felype; 25.02.2015
comment
Видимые модификаторы jar не являются частью Java из-за того, что jar упакованы по своей природе. Можно вручную объединить уже скомпилированные классы (мне приходилось делать это в разных случаях) - если бы внутреннее было возможно в java, это позволило бы легко получить доступ к внутренним методам между классами, которые не должны иметь такой видимости между ними. Баночка не инкапсулирована строго, как dll. - person Radu Simionescu; 11.12.2015
comment
это никогда не похоже на внутреннее. внутренний в .Net говорит о частном сборке, а не о частном пакете. сборка является продуктом вашего проекта, например. в С# файл dll или exe (в java это может быть файл jar или в android apk). В то время как пакет означает папку с файлами классов !!!! java не имеет точной альтернативы internal в C#. я добавлю ответ на это через некоторое время. - person Amir Ziarati; 05.11.2016
comment
@Lotfi: ссылка на внутренний класс пакета извне не позволяет сделать его внутренним для пакета. В этом отношении C#/.NET позволяет вам сделать это, перенеся управление видимостью с языка, чтобы поместить его в систему сборки, что в целом является плохим дизайном IMO. В отличие от сборок .NET, JAR-файлы не изменяют видимость и действительно ортогональны языку, что является лучшим дизайном. В других языках, таких как C++ и Eiffel, также явно объявлена ​​видимость. Внутренний язык С# — грубый инструмент. - person Johan Boulé; 19.12.2016
comment
@RaduSimionescu, но это в значительной степени то, что они сделали с модулями Jigsaw в Java 9, верно? - person CLOVIS; 14.07.2018

Удаление модификатора доступа похоже на внутреннее в 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;
    }
}

Ява

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

person Steven Jeuris    schedule 12.05.2011
comment
Это будет работать ТОЛЬКО в том случае, если классы A, B, C, D находятся в одном пакете. В то время как в С# они просто должны находиться в одном пространстве имен, - person User1234; 14.01.2016
comment
@ User1234 в той же сборке, а не в пространстве имен. - person Roland; 14.03.2016

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

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

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

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

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

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

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

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

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

person Amir Ziarati    schedule 05.11.2016

да. Это называется приватным пакетом, вы просто определяете класс без каких-либо модификаторов:

package com.blah; class Foo{ }

person Steven Fines    schedule 12.05.2011

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

публичный = доступный всем

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

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

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

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

person Jay    schedule 12.05.2011
comment
Для вашего последнего комментария С# защитил внутренний - person projectshave; 01.09.2015
comment
@projectshave Нет, это неправильно. Защищенный внутренний код в С# также доступен со всей сборки. на самом деле, чтобы ограничить доступ класса только к его подклассам, в C# просто используйте protected. в то время как в java защищенный будет доступен из того же пакета плюс к подклассам. - person Amir Ziarati; 06.11.2016

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

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

person Peter Lawrey    schedule 12.05.2011

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

person jarnbjo    schedule 12.05.2011