Подтвердить что ты не робот

Когда длина используется как метод и когда свойство в Java?

Я видел некоторый унаследованный код, который использует свойство length для некоторых объектов и других, которые используют метод length(). В настоящее время я работаю с NodeList из пакета org.w3c.dom, и я обнаружил, что у него есть метод getLength() для получения числа элементов.

Мой вопрос как разработчик Java я могу знать, как определить, когда использовать length, length(), size(), getLength()? очевидно, что это зависит от типа объекта, и API существует для чтения... но суть в том, как Java Development выбирает, какая из них реализуется в своих классах.

Примечание: В вопросе Когда использовать .length vs .length() Макото ответ указывает, что .length является свойством на массивы. Это не вызов метода, а length() - вызов метода на String. Но почему причина? почему бы не использовать когда-либо метод или когда-либо свойство для поддержания согласованности во всем API.

4b9b3361

Ответ 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 сделали плохой дизайн.