Поскольку большинство других классов, по-видимому, позволяют разработчику извлекать длину или размер своего содержимого, вызывая метод, обычно 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()
), а не поля в этом случае.