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