Если строка является неизменной, то почему вы должны вызывать метод, чтобы получить длину, а не просто обращаться к переменной, например, array.length? - PullRequest
7 голосов
/ 29 июля 2011

Мне кажется, что вызов string.length() каждый раз занимает значительно больше времени, чем простой доступ к переменной.

Ответы [ 6 ]

12 голосов
/ 29 июля 2011

String реализует интерфейс CharSequence , который, в свою очередь, определяет метод length.Вы не можете сделать то же самое с переменными, поскольку переменные не могут быть абстрактными или переопределенными.
Как говорят другие люди, Java интенсивно использует интерфейсы.

6 голосов
/ 29 июля 2011

Поскольку доступ к переменной позволил бы вам изменить ее и сломать строку.

И JIT-компилятор достаточно умен, чтобы встроить геттер для вас, поэтому вы фактически просто получаете доступ только кпеременная в любом случае.

Да, и array.length не является «реальной» переменной объекта, а скорее языковой функцией, позволяющей получить доступ к длине массива.Из-за этого это не доступно для записи.С другой стороны, строки являются «обычными» объектами и не обрабатываются специальным образом, будь то компилятор (хотя они и создаются несколько на лету при использовании литералов String в исходном коде).

2 голосов
/ 30 июля 2011

Это не потому, что он неизменен.Даже если он был изменчив, они могли бы вернуть final length.Реальный ответ, вероятно, недосмотр.

2 голосов
/ 29 июля 2011

Для инкапсуляции.

Хорошей практикой является разделение публичного API и деталей реализации.Использование методов (вместо прямого доступа к внутренним переменным) инкапсулирует реализацию, позволяя изменять ее в любое время, не влияя на какой-либо уже написанный код.

1 голос
/ 29 июля 2011

Это потому что String это объект. И объекты обычно имеют методы вместо атрибутов.

Если бы атрибут был public, вы могли бы также изменить его, и это, вероятно, сломало бы вещи.

1 голос
/ 29 июля 2011

Мне кажется, что это всего лишь соглашение Java, что все члены должны быть частными и должны быть доступны только через геттеры и сеттеры. Проблема в том, что если вы сделаете Length публичным, вы можете изменить его и сделать его недействительным (не знаю, зачем вы это делаете, но кто знает).

C # меняет это, позволяя вам создавать свойства с различной доступностью для get и set, поэтому это разрешено (по крайней мере, в C #).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...