Недавно я прочитал this article автор Jake Wharton. Это нацелено на Android, но также отлично подходит для java, я думаю.Видимость методов и их стоимость
Рассмотрим следующий код:
public class A {
private String someField = "abc";
class B {
public void doSomething() {
System.out.println(someField);
}
}
}
У нас есть простой класс А и внутренний класс B (Это есть ссылка на А и может ее членов Гости могут воспользоваться). Класс B получает доступ к полю someField
в A, хотя он является частным. Согласно статье, это делается компилятором, генерирующим synthetic accessor methods
, которые позволяют внутреннему классу получить доступ к полю.
Теперь мой путь более простой вопрос: почему компилятор даже заботится о visiblities при компиляции кода? Как мы видели в этом примере, создается новый метод, который в основном просто вводит служебные данные.
Визуальности - отличная вещь для архивирования хорошего программного обеспечения, но если компилятор сделан, проверяя, что все правильно в соответствии с объявленными видимостями, почему бы не оптимизировать эти методы (например, просто забирать все, чтобы быть общедоступным и разрешать ему звонки)?
Сначала я думал, что это связано с соображениями безопасности, но отражение позволяет получить доступ ко всем полям, не заботясь о видимости, насколько я знаю.
Это может быть основное недоразумение, если так, я был бы счастлив, если бы кто-нибудь мог объяснить это мне.
«Почему компилятор даже заботится о видимости при компиляции кода?» Ну, все, что проверяет код, скорее всего, будет заботиться, с одной стороны ... конечно, компилятор JIT находится в гораздо лучшем месте, чтобы встроить вызовы методов, но это другое дело. (Обратите внимание, что отражение может быть отключено с помощью диспетчера безопасности - и это принудительно выполняется во время * выполнения *. Вы действительно не хотите, чтобы компилятор выдавал код, который будет терпеть неудачу в некоторых средах ...) –