Стоимость приведения к ArrayList объектов, а затем приведения к пользовательскому ArrayList
У меня есть ситуация, в которой я получаю данные из базы данных, и я хочу выгружать их в ArrayList of objects
а затем уменьшить его до другого пользовательского ArrayList т.е. List<User>
, List<Groups>
и т.п.
Мой вопрос - приведение к объекту, а затем приведение к ArrayList, какова будет стоимость, является ли это эффективной или хорошей практикой.
РЕДАКТИРОВАНИЕ
Вместо того, чтобы получать данные как List<User>, List<Groups>
и т.д. Я хочу получить данные как ArrayList<objetcs>
один раз, а затем в соответствии с моей потребностью, я буду понижать данные до ArrayList<User>,
ArrayList<Groups>
позже.
5 ответов
"Приведение вниз" не очень хорошая идея, так как вам не нужно использовать какие-либо специфические методы ArrayList. Вы должны быть в состоянии использовать List
За все. Единственные открытые методы, которые предоставляет ArrayList, которых нет в List, ensureCapacity
(что не так полезно, как кажется) и trimToSize
что редко полезно.
С точки зрения стоимости, это зависит от того, можете ли вы потерпеть неудачу. Если вы не генерируете исключения, типичная проверка типа может занять ~ 40 нано-секунд. Upcast должен быть оптимизирован с помощью JIT.
Если база данных на самом деле не возвращает ArrayList
, кастинг не преобразует его для вас - вместо этого вы увидите ClassCastException
во время выполнения. Вместо этого вы должны создать новую коллекцию типа, который вы хотели бы использовать, и вызвать ее addAll(Collection c)
метод для коллекции, возвращенной из базы данных.
Если вы начнете с ArrayList<Object>
Кастинг это ArrayList
это не upcast: он просто приводит параметризованный тип к своему необработанному аналогу. Кроме того, кастинг ArrayList
в ArrayList<String>
также не является унылым: это непроверенное приведение к параметризованному типу. Оба являются только артефактами компилятора и не имеют эквивалента во время выполнения.
Если ты getting/saving
разные таблицы из database
тогда для каждого table
сначала создайте классы для каждого table
с полным отображением table
, Затем в функции (Вставить, обновить, удалить, выбрать) передать данные с соответствующими объектами класса таблицы. и использовать как есть. Для этого вам нужно создать другую функцию для получения или сохранения данных в таблицу. Но это самый эффективный способ решения этой задачи. Для получения дополнительной информации об апкастинге / даункастинге смотрите ссылку здесь
"Стоимость" с точки зрения производительности будет практически равна нулю (единственная стоимость - проверка во время выполнения при снижении).
Кастинг не меняет список как таковой, только тип ссылки.
В какой форме (тип данных) вы получаете "данные из базы данных"? Если вы ожидаете, что сможете преобразовать, например, JDBC ResultSet в List, это не сработает с приведением типов - вам действительно нужно перебрать ResultSet для получения данных.