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

Общедоступные методы в пакетах-частных классах

Имеет ли смысл отмечать методы как public в классах private-private?

class SomePackagePrivateClass
{
    void foo();          // package private method

    public void bar();   // public method
}

Есть ли какая-либо практическая разница в видимости между foo и bar здесь?

4b9b3361

Ответ 1

Если класс не будет расширяться другим, более видимым подклассом *, единственным отличием является ясность намерения. Объявление всех методов private-пакетов затрудняет для будущих читателей определение того, какие из методов предназначены для вызова другими классами в одном пакете.

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

Ответ 2

Пример использования наследования:

A.java

package pkg1

class A {
  void foo();
  public void bar() {};
}

B.java

package pkg1

public class B extends A{

}

C.java

package pkg2

public class C {
  public void doSomething() {
   B b = new B();
   b.bar(); //ok
   b.foo(); //won't work, since foo() is not visible outside of package 'pkg1'

   A a = new A(); //won't work since A is not visible outside of package 'pkg1'
   a.bar(); //won't work, since a cannot be created
  }
}

Ответ 3

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

Ответ 4

Это очень мало отличается, если класс не расширен публичным (или защищенным вложенным) классом.

В целях согласованности я бы пошел на public. Методы должны быть редкими, кроме методов public или private.

В пакете private java.lang.AbstractStringBuilder существует ряд примеров открытых методов. Например, length() является общедоступным в AbstractStringBuilder и отображается в открытом классе StringBuilder (переопределяется в StringBuffer, чтобы добавить синхронизацию).

Ответ 5

Ну... у меня тоже было это сомнение (почему я искал эту тему). Это может быть хорошим вопросом.

Но...

После второй мысли все действительно проще, чем мы думали.

Пакет-частный метод - это пакетно-частный метод.

Кажется, нонсенс? Но...

Пакет-частный метод, даже если его класс наследуется, он по-прежнему является приватным методом package.

Теперь это имеет смысл? Для более подробного объяснения:

Пакет-частный метод, даже если его класс наследуется более видимым подклассом, он по-прежнему является приватным методом пакета.

Если подкласс имеет один и тот же пакет, эти приватно-частные методы также унаследованы, , но они все еще являются закрытыми для пакета.

Если подкласс имеет разный пакет (здесь нам нужно, чтобы родительский класс был общедоступным, с некоторыми приватными частными методами), эти частные методы не унаследованы (потому что они не видны вообще).

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


Вышеописанная информация о пакете-приватном методе. И случай публичного метода - то же самое.

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

В примере OP, когда foo() и bar() находятся в классе private-private, их видимость в данный момент ограничена private-пакетом, пока не добавляются дополнительные коды (например, наследование).

Надеюсь, что это ясно (и просто) достаточно.

P.S. таблица контроля доступа Java

Ответ 6

Да. public методы в классе private-private могут быть полезны. Иллюстративный пример из библиотеки java (и взятый из классической "эффективной java" ):

Вы когда-нибудь видели java.util.JumboEnumSet, java.util.RegularEnumSet? Вероятно, нет, потому что они являются частными и не упоминаются в документации.

Вы когда-нибудь использовали их? Вероятно, да. Они возвращаются статическим методом java.util.EnumSet.noneOf(...). Хотя вы не можете их самостоятельно создать, вы можете использовать их общедоступные методы, когда они возвращаются из этого метода.

Хорошо, что вы не знаете, какой из них вы используете, или даже того, что они существуют. Java решает, какой из них более эффективен в зависимости от аргументов, и может использовать другое в более новой версии. Вы получаете доступ к их функциям, обращаясь к ним через их общий интерфейс (что является хорошей практикой!)

Ответ 7

foo имеет default package visibility, где as bar имеет видимость public