Есть ли какое-либо различие между значением по умолчанию (пакет) и уровнем открытого доступа методов в классе со значением по умолчанию (пакет) уровень доступа?

Тот же вопрос в коде:

class Foo {

   int getIntProperty () { ... }

   CustomObject getObjectProperty () { ... }

   void setIntProperty (int i) { ... }

   void setObjectProperty (CustomObject obj) { ... }

   //any other methods with default access level    
}

VS

class Foo {

   public int getIntProperty () { ... }

   public CustomObject getObjectProperty () { ... }

   public void setIntProperty (int i) { ... }

   public void setObjectProperty (CustomObject obj) { ... }

   //any other methods with public access level   
}
5
задан Roman 3 February 2010 в 16:00
поделиться

4 ответа

Существует разница, когда вы подклассифицируете Foo:

public class Bar extends Foo {

}

, а затем пытаетесь использовать другой пакет:

new Bar().getIntProperty ()

Он будет компилироваться во втором из ваших примеров (все методы общедоступны), но не в первом (все методы доступ по умолчанию)

5
ответ дан 14 December 2019 в 08:50
поделиться

Кстати, это не вычислительный факториал.

Если вы действительно пытаетесь выяснить, куда уходит время, вы можете попробовать stackshots . Я наложил бесконечный цикл на ваш код и забрал 10 из них. Вот код:

 6: void forloop(void){ 
 7:   int fac=1; 
 8:   int count=5; 
 9:   int i,k; 
10:
11:   for (i = 1; i <= count; i++){ 
12:       for(k=1;k<=count;k++){ 
13:           fac = fac * i; 
14:       } 
15:   } 
16: } 
17:
18: int main(int argc, char* argv[])
19: {
20: int i;
21: for (;;){
22:     forloop();
23: }
24: return 0;
25: }

И вот стопки, переупорядоченные с наиболее частыми наверху:

forloop() line 12
main() line 23

forloop() line 12 + 21 bytes
main() line 23

forloop() line 12 + 21 bytes
main() line 23

forloop() line 12 + 9 bytes
main() line 23

forloop() line 13 + 7 bytes
main() line 23

forloop() line 13 + 3 bytes
main() line 23

forloop() line 6 + 22 bytes
main() line 23

forloop() line 14
main() line 23

forloop() line 7
main() line 23

forloop() line 11 + 9 bytes
main() line 23

Что это вам говорит? В ней говорится, что линия 12 потребляет около 40% времени, а линия 13 - около 20% времени. Это также говорит о том, что линия 23 потребляет почти 100% времени.

Это означает, что разворачивание петли на линии 12 потенциально может дать вам коэффициент ускорения 100/( 100-40) = 100/60 = 1 67x приблизительно. Конечно, есть и другие способы ускорить этот код, такие как устранение внутреннего цикла, если вы действительно пытаетесь вычислить факториал.

Я просто указываю на это, потому что это простой способ профилирования.

-121--3107672-

Да и нет.

В приведенном примере нет значимой разницы - по крайней мере, когда речь идет о других классах, обращающихся к методу. Но иногда у тебя...

public interface Bar {
    CustomObject getObjectProperty ();
}

И Foo реализует Bar , и в этом случае требуется public, даже в пределах закрытого пакета Foo.

-121--4903951-

Из http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html выглядит так, что члены не набора public, в первом примере,не будет видныен подклассам Foo, в то время как набор членов public, во втором примере, будет виден подклассам Foo.

2
ответ дан 14 December 2019 в 08:50
поделиться

Реализация интерфейсов

Я только могу представить, что ваш класс доступа по умолчанию реализует некоторый интерфейс. Затем вам понадобятся общедоступные методы для его реализации (доступ к вашему классу доступа по умолчанию будет осуществляться вне пакета через интерфейс).

Как любая частная / защищенная / анонимная реализация интерфейса.

Язык Java должен его поддерживать.

Править

Представьте, что вы создаете экземпляр и передаете его классу аутсайдеров (как объект).

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

0
ответ дан 14 December 2019 в 08:50
поделиться

Да и нет.

В приведенном вами примере нет значимой разницы - по крайней мере, когда дело доходит до других классов, обращающихся к методу. Но иногда у вас есть ...

public interface Bar {
    CustomObject getObjectProperty ();
}

И Foo реализует Bar , и в этом случае общедоступный необходим, даже внутри закрытого пакета Foo.

0
ответ дан 14 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: