Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> extends ArrayList<Object> VS. поле с objects ? 
:(
    Опции темы
Andrey1
Дата 8.5.2009, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 27.2.2004
Где: Moscow

Репутация: 1
Всего: 5



Я понял, что не вижу архитектурной разницы между двумя определениями классов: 

Код

public class ListOfObject extends ArrayList<Object> {
    
    private static final long serialVersionUID = -7944681041635737742L;

   String name;
...
  
}



Код

public class ListOfObject2 {
    
   List<Object> objects;

   String name;
...
  
}


Класс должен иметь список объектов и некоторые свойства, присущие только всему списку.

У двух классов есть, конечно разница в том, что экземпляр `obj' первого класса можно передать в метод аля setSomeData((ArrayList)obj), но если все свои обработчики переписать только через геттеры: 

Код

ListOfObject2 obj2=...;
obj2.setObjects(...getProcessedObjects(obj2.getObjects()));


,то вроде бы и разницы нет.

Второе определение как-то более прозрачно...

Это сообщение отредактировал(а) Andrey1 - 8.5.2009, 13:01


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
goodday1941
Дата 8.5.2009, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

Репутация: 1
Всего: 9



а как же инкапсуляция )


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
SoulKeeper
Дата 8.5.2009, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: 11
Всего: 15



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

Это сообщение отредактировал(а) SoulKeeper - 8.5.2009, 13:44
PM MAIL   Вверх
Andrey1
Дата 9.5.2009, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 27.2.2004
Где: Moscow

Репутация: 1
Всего: 5



Цитата(goodday1941 @  8.5.2009,  13:05 Найти цитируемый пост)
а как же инкапсуляция ) 

А чего с ней не так?


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
math64
Дата 9.5.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



В первом случае у Вас фиксированная релизацация списка как ArrayList.
Во втором случае Вы можете поменять её на LinkedList или что Вам угодно.
Во втором случае можно добавить implements List<Object>, чтобы получить преимущества первого варианта.
PM   Вверх
Alix
Дата 12.5.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: нет
Всего: 23



Есть мнение, что ответ на этот вопрос может зависеть от области применения этого класса. 

Например, надо сделать класс-модель таблицы JTable. Допустим все необходимые методы вроде getRowCount, getElementAt и т.п. реализованы. Но теперь надо приделать методы, которые позволят классу-эксплуататору модели вносить в нее изменения (добавление/удаление строк, например). Казалось бы, в этом плане расширение класса (например, как в Вашем примере, ArrayList) только на пользу, ведь все эти методы уже будут определены. Но ведь после любого внесения изменения надо оповещать об этом таблицу, а значит придется тщательно все методы меняющие данные перегружать и писать в них вызов super + fireXXX. Таким образом, кода придется написать больше, чем во втором случае, да еще и можно что-то пропустить.


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
goodday1941
Дата 12.5.2009, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

Репутация: 1
Всего: 9



вообще правильно было сказано все зависит от области применения )


вот к примеру хотим мы реализовать очередь (ну или стек) с помощью List ... и сделать это можно как первым, так и вторым способом..
но в первом случае у нас будет куча методов которые нам не нужны (например get(int index)), а во втором будет доступно всего три метода к примеру get(), put(Object o), clear()

другой вариант: нас не устраивает количество функционала в ArrayList (то есть нужно все что есть + еще к примеру выборка всех элементов через один (smile вот в такой ситуации конечно лучше делать extend




--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
Joss
Дата 13.5.2009, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 19.3.2006

Репутация: нет
Всего: 1



Как по мне, лучше всего будет использовать второй вариант + если необходимо реализовывать интерфейс Collection или List. А если уже и наследоваться, то рассмотреть использование AbstractList или AbstractCollection в качестве базового класса. Хотя, как было уже сказано, все зависит от задачи.
PM MAIL   Вверх
Andrey1
Дата 13.5.2009, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 27.2.2004
Где: Moscow

Репутация: 1
Всего: 5



Цитата(Joss @  13.5.2009,  08:58 Найти цитируемый пост)
Хотя, как было уже сказано, все зависит от задачи. 

Да, все [в этом мире] зависит от задачи smile.
Проблема в том, что как правило в момент описания класса точная задача еще не ясна.
Для себя я сделал вывод, что если этот новый класс не нужно встраивать в существующий код, где требуется ArrayList<?> и не требуется именно расширение ArrayList<?>, то лучше использовать второй класс.




Это сообщение отредактировал(а) Andrey1 - 13.5.2009, 11:27


--------------------
Созерцание и мудрость - едины. Соцерцание - это основа мудрости, а мудрость - это функция (т.е. умение использовать) созерцания.
из сутры помоста шестого патриарха Хуэйнена
PM MAIL WWW ICQ   Вверх
goodday1941
Дата 13.5.2009, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

Репутация: 1
Всего: 9



вот и пришли снова к инкапсуляции smile


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0695 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.