Когда длина используется как метод и когда свойство в Java?
Я видел некоторый унаследованный код, который использует свойство length
для некоторых объектов и других, которые используют метод length()
. В настоящее время я работаю с NodeList
из пакета org.w3c.dom
, и я обнаружил, что у него есть метод getLength()
для получения числа элементов.
Мой вопрос как разработчик Java я могу знать, как определить, когда использовать length
, length()
, size()
, getLength()
? очевидно, что это зависит от типа объекта, и API существует для чтения... но суть в том, как Java Development выбирает, какая из них реализуется в своих классах.
Примечание: В вопросе Когда использовать .length vs .length() Макото ответ указывает, что .length
является свойством на массивы. Это не вызов метода, а length()
- вызов метода на String. Но почему причина? почему бы не использовать когда-либо метод или когда-либо свойство для поддержания согласованности во всем API.
Ответы
Ответ 1
как разработчики Java выбирают, какие из [методов] реализовать в своих классах?
Когда вы реализуете классы, содержащие другие объекты, это почти всегда будет size()
, метод, предоставляемый интерфейсом Collection
.
Что касается других вариантов выбора, вы должны избегать раскрытия переменных-членов, даже конечных, поскольку к ним нельзя получить доступ через интерфейс. Java избавляется от этого для массивов из-за некоторой обманчивости JVM, но вы не можете сделать то же самое. Следовательно, length
должен отсутствовать: он остается на Java, потому что невозможно изменить что-то основное, что было на языке с первого дня, но это определенно не то, что нужно учитывать при разработке новых классов.
Когда вы реализуете свой собственный тип с длиной (например, прямоугольник или сегмент линии), вы должны предпочесть getLength()
в length()
из-за соглашений об именах Java Beans.
Ответ 2
очевидно, что это зависит от типа объекта, и API существует для чтения...
Вы уже сами ответили на свой вопрос: посмотрите в документации API любого класса, который вы используете.
но суть в том, как Java Development выбирает, какой из них реализуется в своих классах.
Классы в стандартной библиотеке Java были разработаны в течение длительного периода времени разными людьми, которые не всегда делают один и тот же выбор для имени методов, поэтому существуют несоответствия, и, к сожалению, вам просто нужно будет жить с что.
Ответ 3
Нет четкого правила, иначе мы не увидели бы такого смешения в самом jdk. Но вот некоторые вещи, которые следует учитывать при принятии такого конструктивного решения.
-
Не волнуйся. Это второстепенная вещь и не будет иметь большого значения. Поэтому, когда вы думаете больше, чем 5 минут об этом, вы, вероятно, тратите деньги уже.
-
Используйте геттеры, когда они нужны. Многие рамки зависят от стиля геттера. Если вам нужны или хотят, чтобы такие фреймворки хорошо работали с вашим классом, может быть полезно использовать этот стиль.
-
Чем короче, тем лучше. часть "получить" не увеличивает ясность. Он просто генерирует символы шума в исходный код, поэтому, если вам это не нужно по какой-то причине, не используйте его.
-
Способы легче развиваться. Длина часто является количеством, которое не задано напрямую, а каким-то образом вычислено. Если вы скрываете это за методом, это дает вам гибкость для изменения этой реализации позже, без изменения API.
-
Прямой доступ к полям должен быть немного быстрее, но если вы не работаете с крупнотоннажной онлайн-трейдингом или чем-то еще, разницу даже не стоит об этом думать. И если вы это сделаете, вы должны сделать свои собственные измерения, прежде чем принимать решение. Компилятор hotspot почти наверняка встроит вызов метода в любом случае.
Итак, если нет внешних сил, ведущих вас в другом направлении, я бы пошел с длиной() '
Ответ 4
В соответствии с принципами OOPS длина должна быть атрибутом, а getLength() должен быть методом. Также атрибут length должен быть инкапсулирован должен быть открыт с помощью методов, поэтому getLength() звучит более уместно.
К сожалению, не все классы библиотеки Java соответствуют стандартам. Есть некоторые исключения, и это один из них.
Ответ 5
В чистом языке OO это должен быть, вероятно, всегда метод типа length()
. Таким образом, в иерархии классов вы можете переопределить длину атрибута.
Но Java не является чистым OO. И главная причина для полей (.length) vs method (length()) - это проблемы производительности.
И даже программисты Sun/Oracle сделали плохой дизайн.