В C# вы можете пометить класс как internal
, чтобы он был доступен только из того же пакета. Есть ли что-то подобное в Java?
Есть ли что-то вроде внутреннего класса в Java?
Ответы (7)
Вы можете создавать закрытые для пакета классы, опуская модификатор безопасности (public, private) в объявлении класса.
package com.sample;
class MyPackagePrivateClass
{
...
}
Удаление модификатора доступа похоже на внутреннее в 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
на этот вопрос уже был принят ответ, но я думаю, что ответ не совсем ясен для тех, кто новичок в java из .Net.
Есть ли в java какой-то точный эквивалент внутреннего модификатора в С#? короткий ответ НЕТ (но вы можете добиться этого каким-то образом, и я скажу)!!
internal в C# на самом деле является модификатором, приватным для сборки. что такое сборка?
Сборка — это любой продукт вашего проекта (DLL или EXE в C# — эквивалентом в java может быть файл JAR)
нет точного эквивалента для внутреннего в java. и то, на что ответил Брайан Кайл и что было принято, на самом деле является частным пакетом (пакеты в java эквивалентны пространствам имен в C #), но каким-то образом то, на что был дан ответ, является самым близким способом получить тот же результат.
НО как получить полностью тот же результат, что и внутренний? у java нет решения для этого? ответ ДА.
у него есть. но не с модификатором. на самом деле лучший способ сделать это - секрет в упаковке. лучшая практика упаковки - упаковать классы по их отношению, а не по их типу.
многие из нас используют пакеты с именами Models или Presenters и помещают в них все наши модели или Presenters. пока это неправильно. пакеты должны быть похожи на Book, содержащие BookModel.java, BookPresenter.java, .....
таким образом, вы можете сделать их закрытыми для пакетов, опустив модификатор, и у вас не возникнет проблем, потому что вы можете получить к ним доступ в любом классе, которому нужен ваш закрытый для пакетов класс, потому что у вас есть хорошая практика упаковки.
да. Это называется приватным пакетом, вы просто определяете класс без каких-либо модификаторов:
package com.blah;
class Foo{ }
Я не знаком с С#, но в Java защита по умолчанию заключается в том, что что-то доступно только внутри пакета:
публичный = доступный всем
private=доступен только внутри текущего класса
защищенный = доступный в пакете или в любом классе, который наследуется от текущего класса
по умолчанию = доступно в пакете
Я всегда думал, что должен быть способ сказать «доступен любому классу, который наследуется от текущего класса, но не откуда-либо еще, из этого пакета или любого другого». Но нет.
Вы можете сделать пакет класса локальным. Это область действия по умолчанию для класса. то есть там, где у вас нет модификаторов доступа.
Если вы действительно хотите указать время, вы можете создать аннотацию, например. @package_local, я делаю это в тех местах, где я хочу, чтобы это было локально для пакета, а не просто не оставлял его без указания.
Да, уровень доступа по умолчанию (закрытый пакет). Просто исключите любой модификатор доступа в определении вашего класса, и вы получите то, что хотите.
packages
. У них естьnamespaces
иassemblies
. Пакеты эквивалентны пространствам имен. Но сборки можно сравнить с файлами JAR в Java. Модификаторinternal
делает класс доступным только внутри сборки. Таким образом, он не имеет ничего общего с пространствами имен или пакетами. - person nedR   schedule 05.02.2014