В С# вы можете пометить класс как internal
, чтобы он был доступен только из одного и того же пакета. Есть ли что-то подобное в Java?
Есть что-то вроде внутреннего класса в Java?
Ответ 1
Вы можете создавать классы класса private, опуская модификатор безопасности (открытый, закрытый) из объявления класса.
package com.sample;
class MyPackagePrivateClass
{
...
}
Ответ 2
Удаление модификатора доступа аналогично внутреннему в С#.
С#
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
Ответ 3
этот вопрос имеет принятый ответ раньше, но я думаю, что ответ не совсем ясен для кого-то нового в java, исходящего из .Net.
Есть ли у java точный эквивалент для внутреннего модификатора в С#? короткий ответ НЕТ (но вы можете добиться этого, как и я скажу)!!
internal в С# на самом деле является модификатором "assembly-private". что такое сборка?
Сборка - это любой продукт вашего проекта (DLL или EXE в С# - эквивалент в java может быть JAR файлом)
нет никакого точного эквивалента для внутреннего в java. и на что ответил Брайан Кайл и принято на самом деле "package-private" (пакеты в java эквивалентны для пространств имен на С#), но некоторые ответы на них - это самый близкий способ получить тот же результат.
НО, как получить тот же результат, что и внутренний? у can not java есть решение для этого? ответ ДА.
у него есть. но не с модификатором. на самом деле лучший способ сделать это - секрет в упаковке. наилучшей практикой упаковки является упаковка ваших классов по их отношению не по их типу.
многие из нас используют пакеты под названием "Модели" или "Презентаторы" и помещают в них все наши модели или презентаторы. в то время как это так чертовски неправильно. пакеты должны быть как "Книга", содержащая "BookModel.java", "BookPresenter.java",.....
таким образом вы можете сделать их закрытыми с помощью пакета, упустив модификатор и не испытывая никаких проблем, потому что вы можете получить к ним доступ в любом классе, который нуждается в вашем пакете-приватном классе, потому что у вас есть хорошая практика упаковки.
Ответ 4
Да. Он назывался package private, вы просто определяете класс без каких-либо модификаторов:
package com.blah;
class Foo{ }
Ответ 5
Я не знаком с С#, но в Java защита по умолчанию заключается в том, что что-то доступно только в пакете:
public = доступно любому
private = доступно только в текущем классе
protected = доступно в пакете или в любом классе, который наследует от текущего класса
default = доступно в пакете
Я всегда думал, что должен быть способ сказать "доступный любому классу, который наследуется от текущего класса, но не из другого места, этого пакета или любого другого". Но нет.
Ответ 6
Вы можете сделать пакет класса локальным. Это класс по умолчанию для класса. т.е. когда у вас нет модификаторов доступа.
Если вы действительно хотите поместить когда-нибудь, вы можете создать аннотацию, например. @package_local, я делаю это в тех местах, где я хочу, чтобы он был локальным, и не просто оставил его неопределенным.
Ответ 7
Да, уровень доступа по умолчанию (пакетный). Просто оставьте какой-либо модификатор доступа в определении класса и получите то, что вы хотите.