Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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

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