Какова мотивация извлечения длины массива с использованием переменной открытого экземпляра вместо вызова метода?

Поскольку большинство других классов, по-видимому, позволяют разработчику извлекать длину или размер своего содержимого, вызывая метод, обычно length() или size(), как получается, что длина массива извлекается, читая переменную экземпляра length? Мне это кажется непоследовательным, тем более что объект String неизменен и по-прежнему использует метод length().

Ответ 1

Это непоследовательно. Я полагаю, что фактическая причина различия может быть найдена только в ранней истории развития языка Java. Возможно, это было то, что казалось в то время соображениями производительности. Я подозреваю, что если бы Java разрабатывалась с нуля сегодня, поле length исчезло бы, и вместо этого существовал бы класс java.lang.Array * (аналогичный java.lang.Enum), из которого все массивы, которые будут включать метод length(), унаследованный всеми массивами.

Собственно, отсутствие класса Array (в приведенном выше смысле) может указывать, почему существует атрибут length: массивы более "встроены" в язык, чем, скажем, классы коллекции (которые являются частью библиотеки классов).

* Java имеет java.lang.reflect.Array, но это делает что-то совершенно отличное от того, о чем я говорю.

Ответ 2

Большинство коллекций имеют динамические размеры, поэтому им нужен метод проверки длины/размера в это конкретное время. Массив имеет фиксированную длину, поэтому его не нужно перечитывать все время.

Ответ 3

Массив имеет фиксированный размер - он никогда не изменится. Таким образом, вам не нужны накладные расходы метода.

Ответ 4

Причина в том, что JLS говорит так:

Элементы типа массива являются следующими:

  • Открытое конечное поле length, которое содержит количество компонентов массива. длина может быть положительной или нулевой.

Относительно основной мотивации: только люди, которые создали язык, могут ответить...

Интересно, что Дуб, который является языком в начале Java, уже имел это понятие. Если вы прочтете его спецификации, вы увидите, что:

Длина любого массива может быть найдена с помощью .length

Итак, лучше всего предположить, что это результат решения нескольких парней более 20 лет назад.

Ответ 5

Метод выполняется каждый раз, когда он вызывает. Оптимизация существует, например, кеш и т.д., Но дело в том, что массив никогда не меняет свой размер.

Таким образом, что может лучше соответствовать случаю, чем "окончательное" (не уверенное в реализации под капотом, но такое же понятие) поле экземпляра?

java.util.Collection описывает некоторые классы, которые переносят массивы типа ArrayList, HashSet и т.д. В их случае размер изменяется, так как концепция коллекции должна иметь расширяемый массив. Таким образом, размер должен быть рассчитан с помощью метода (size()), а не поля в этом случае.