2014-12-16 3 views
13

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

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

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

+0

Эй, то Java API имеет хлам уходящий от почти 20 лет, я знаю ... В любом случае, конвенция в настоящее время в основном предназначена для использования геттеров, поэтому вы чаще будете видеть '.getLength()'. Ну, 'Collection' имеет' .size() '... – fge

+5

Java не имеет свойств. длина - поле. Для массивов вы используете длину, для списков вы используете size(). Там будет множество классов, где есть поля и методы со всеми типами имен, поэтому на это очень сложно ответить, но если вы нажмете. после объекта в вашей среде IDE должен появиться список всех вещей, которые вы можете сделать с ним. –

+0

У вас не будет никаких шансов, но вам придется искать документацию для каждого типа, который вы хотите использовать. – 5gon12eder

ответ

8

Как разработчики Java выбирают, какие из [методов] реализовать в своих классах?

При реализации классов, которые содержат другие объекты, это почти всегда будет size(), метод, предоставленный интерфейс Collection.

Что касается других вариантов, вы должны избегать раскрытия переменных-членов, даже конечных, потому что к ним нельзя получить доступ через интерфейс. Java избавляется от этого для массивов из-за некоторой обманчивости JVM, но вы не можете сделать то же самое. Следовательно, length должен отсутствовать: он остается на Java, потому что невозможно изменить что-то основное, что было на языке с первого дня, но это определенно не то, что нужно учитывать при разработке новых классов.

Когда вы реализуете свой собственный тип, который имеет длину (например, прямоугольник или сегмент линии), вы должны предпочесть getLength() в length() из-за соглашений об именах Java Beans.

+0

Очень хороший ответ и +1 для этого. Я упомянул ваш ответ в своем ответе. Просто сомневаюсь, почему ответ Джеспера был + 3'd, а твой не было! –

5

, очевидно, зависит от типа объекта и API есть для чтения ...

Вы уже ответили на свой вопрос самостоятельно: смотрите в документации API в любой класс, который вы используете.

но суть в том, как Java Development выбирает, какая из них реализует в своих классах.

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

+0

Довольно бесполезная причина по моему мнению. См. Ответ 'dasblinkenlight' или мой. Я сомневаюсь, почему это было трижды! –

+0

@shekharsuman Я думаю, что я интерпретировал вопрос иначе, чем вы. Я думал, что вопрос: «Почему люди, которые разработали стандартную библиотеку, выбрали такие непоследовательные имена?», Хотя вы, вероятно, думаете, что вопрос «какое имя я должен выбрать, когда я создаю класс?». – Jesper

+0

Теперь я сам смутился об этом! Возможно, потому что мой прием - это второй, который вы упомянули! Но, я думаю, намерение OP такое же, как мое! –

-3

В чистом языке OO должен быть, вероятно, всегда такой метод, как length(). Поэтому в иерархии классов вы можете переопределить длину атрибута.

Но Java не является чистым ОО. И главная причина для полей (.length) vs method (length()) - это проблемы производительности.

И даже программисты Sun/Oracle сделали плохой дизайн.

+1

сильное отличие java между методами и полями не имеет ничего общего с OO. Также в OO нет ничего, что указывает, следует ли вам предпочесть getX или просто X. –

+0

он должен сделать, как основатель Java понимает или интерпретирует OO. Они сказали, что Java - это OOL. Фон действительно широко обсуждается как вопрос программирования. – PeterMmm

0

В соответствии с принципами OOPS длина должна быть атрибутом, а getLength() должен быть методом. Также атрибут length должен быть инкапсулирован должен быть открыт с помощью методов, поэтому getLength() звучит более уместно.

К сожалению, не все классы библиотеки Java соответствуют стандартам. Есть некоторые исключения, и это один из них.

2

Нет четкого правила, иначе мы не увидели бы такого смешивания в самом jdk. Но вот некоторые моменты, которые следует учитывать при принятии такого дизайнерского решения.

  1. Не волнуйся. Это второстепенная вещь и не будет иметь большого значения. Поэтому, когда вы думаете больше, чем 5 минут об этом, вы, вероятно, тратите деньги уже.

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

  3. Короче, лучше. часть «получить» не увеличивает ясность. Он просто генерирует символы шума в исходный код, поэтому, если вам это не нужно по какой-то причине, не используйте его.

  4. Способы легче развиваться. Длина часто является количеством, которое не задано напрямую, а каким-то образом вычислено. Если вы скрываете это за методом, это дает вам гибкость для изменения этой реализации позже, без изменения API.

  5. Прямой доступ к полям должен быть немного быстрее, но если вы не работаете с крупнотоннажной онлайн-торговкой или чем-то еще, то разницу даже не стоит об этом думать. И если вы это сделаете, вы должны сделать свои собственные измерения, прежде чем принимать решение. Компилятор hotspot почти наверняка встроит вызов метода в любом случае.

Так что, если нет каких-либо внешние сил, движущих вас в другом направлении, я бы с «длиной()»

Смежные вопросы