Здравствуйте, Trean, Вы писали:
T>Ну, я не Lucker, но так понимаю что это "best-effort practice", final объявляет константное значение, в данном случае ссылку, и T>может быть примененна какая-то оптимизация. Но точных данных на этот счет нет. В мустанге обешали более агрессивное использование T>регистров для хранения переменных, может какой-то выигрыш и будет. Кстати бета Мустанга вышла на прошлой неделе.
Ну, это как на стройке говорить б#я, нафамилия-китайской-спортсменки и так далее — можно и без этого, но как-то быстро привыкаешь, что потом без этого уже и не можешь. Насчет оптимизаций — не уверен, но семантическую нагрузка есть. Кстати, замечено, что как и на стройке, через некоторое время активного использования читать код без final как-то не комфортно.
Недавно начал изучать Java и появился следующий вопрос:
Вот есть вектор directory, в котором я храню объекты типа Record. В типе Record есть метод getName(), который мне надо бы вызывать для элементов вектора.
Но конструкции вида: directory.elementAt(i).getName() не проходят, поскольку directory.elementAt(i) возвращает объект типа Object.
Как с этим быть?
Здравствуйте, AutumnLeaf, Вы писали:
AL>Недавно начал изучать Java и появился следующий вопрос: AL>Вот есть вектор directory, в котором я храню объекты типа Record. В типе Record есть метод getName(), который мне надо бы вызывать для элементов вектора. AL>Но конструкции вида: directory.elementAt(i).getName() не проходят, поскольку directory.elementAt(i) возвращает объект типа Object. AL>Как с этим быть?
или привести к типу: ((Record)directory.elementAt(i)).getName()
или если у тебя 1.5 и выше — использовать генерики:
что-то вроде
final List<Record> directory = new List<Record>();
directory.add(new Record("rec1"));
directory.add(new Record("rec2"))
directory.add(new Record("rec3"))
...
direcotry.get(i).getName();
Здравствуйте, AutumnLeaf, Вы писали:
AL>Недавно начал изучать Java и появился следующий вопрос: AL>Вот есть вектор directory, в котором я храню объекты типа Record. В типе Record есть метод getName(), который мне надо бы вызывать для элементов вектора. AL>Но конструкции вида: directory.elementAt(i).getName() не проходят, поскольку directory.elementAt(i) возвращает объект типа Object. AL>Как с этим быть?
Здравствуйте, AutumnLeaf, Вы писали:
AL>Спасибо, это сработало. AL>А какой их вариантов предпочтительнее, с генериками? AL>И какую цель преследует "final"?
Ну, я не Lucker, но так понимаю что это "best-effort practice", final объявляет константное значение, в данном случае ссылку, и
может быть примененна какая-то оптимизация. Но точных данных на этот счет нет. В мустанге обешали более агрессивное использование
регистров для хранения переменных, может какой-то выигрыш и будет. Кстати бета Мустанга вышла на прошлой неделе.
Здравствуйте, Lucker, Вы писали:
L>Здравствуйте, Trean, Вы писали:
T>>Ну, я не Lucker, но так понимаю что это "best-effort practice", final объявляет константное значение, в данном случае ссылку, и T>>может быть примененна какая-то оптимизация. Но точных данных на этот счет нет. В мустанге обешали более агрессивное использование T>>регистров для хранения переменных, может какой-то выигрыш и будет. Кстати бета Мустанга вышла на прошлой неделе.
L>Ну, это как на стройке говорить б#я, нафамилия-китайской-спортсменки и так далее — можно и без этого, но как-то быстро привыкаешь, что потом без этого уже и не можешь. Насчет оптимизаций — не уверен, но семантическую нагрузка есть. Кстати, замечено, что как и на стройке, через некоторое время активного использования читать код без final как-то не комфортно.
Я, кстати, так тоже пишу, во-первых: раз переменная не должна меняться а блоке кода, есть смысл объявить ее константой. Во-вторых, теоретически выигрыш может быть в таком случае:
for(int i = 0; i < list.size(); i++) {
...
}
final int n = list.size();
for(int i = 0; i < n; i++) {
...
}
Если в теле цикла список не модифицируется, то есть смысл сохранить значение длины, она может быть загружена в регистр только один раз, и вызывать size() каждый раз не потребуется. Возможен + эффект и в многопоточных приложениях, константы (как и все immutable objects) можно шарить между потоками безопасно и не требуется их копировать, чтобы измежать модификации другим потоком (подробнее было в Java Memory Model Spec).
Я опять же испытаний не проводил, и редко охочусь за наносекундами, но всегда стараюсь дать компилятору как можно больше семантической информации.
Здравствуйте, AutumnLeaf, Вы писали:
AL>А какой их вариантов предпочтительнее, с генериками?
Генерики, теоретически, позволяют избавиться от ошибок в преобразовании типов и ClassCastException в ходе выполнения программы. То есть использование генериков делает программу чуть-чуть надежнее.
Здравствуйте, slskor, Вы писали:
S>Генерики, теоретически, позволяют избавиться от ошибок в преобразовании типов и ClassCastException в ходе выполнения программы. То есть использование генериков делает программу чуть-чуть надежнее.
Может когда-нибудь использование генериков будет делать программу быстрее?