Можете ли вы расширить ArrayList в Java? - PullRequest
27 голосов
/ 24 января 2011

Можно ли создать дочерний класс, расширяющий ArrayList? Если да, то как?

Ответы [ 6 ]

20 голосов
/ 24 января 2011

Да, вы можете.

public class MyArrayList<E> extends ArrayList<E>
{
}

Однако я не уверен, почему вы захотите это сделать.

16 голосов
/ 24 января 2011

Вы можете расширить любой класс, который не final в Java.Сказав это, вы должны избегать наследования, если не существует отношения true is-a .Рассмотрим композицию для повторного использования.Читайте о принципе замены Лискова

9 голосов
/ 24 января 2011

Как говорили многие другие, да, вы можете расширить класс ArrayList, но это не то, что вы обычно должны делать;это не считается хорошей практикой в ​​Java.

Я в основном программист на Java, но последние месяцы я также работал над кодом C #.Кажется, что в C # это распространенная идиома - расширять стандартные классы коллекций, если вам нужна коллекция определенного типа (на самом деле, я не знаю, является ли она общей идиомой вообще - по крайней мере, люди, написавшие код I)я работаю с этим и делаю это все время).

Так что, если у них есть класс Person и им нужен список людей, они создадут класс PersonList, который расширяет C # эквивалент ArrayList<Person>.

Распространенная идиома в Java будет просто использовать ArrayList<Person>, если вам нужен список Person объектов, а не создавать для этого определенный подкласс.

Я бысоветую придерживаться общепринятого Java-способа ведения дел, а не создавать собственные подклассы ArrayList или другие классы коллекций.

2 голосов
/ 24 января 2011

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

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

0 голосов
/ 04 апреля 2018

Как говорили другие, расширение структур данных Java-языка - очень плохая идея.Однако, если у вас есть логика, которую вы хотите выделить в классе коллекции, я бы предложил следующее решение:

public class ProductCollection{

    ArrayList<Product> products;

    public Product getByCode(String code) {
       // ... your logic goes here.
    }
}
0 голосов
/ 24 января 2011

Просто попробуйте. Класс не является окончательным, его конструктор общедоступен, так что вы можете. Тем не менее, это, вероятно, не хорошая идея для начинающего.

В большинстве случаев это ни для кого не очень хорошая идея. Представьте, что вы добавили некоторую функциональность и получили ExtList1 extends ArrayList. Ваш колледж добавляет другую независимую функциональность, поэтому у вас есть ExtList2 extends ArrayList. Теперь вы хотите их обоих сразу, и вам не повезло.

Или вам нужна та же функция с другой реализацией базового списка (возможно, LinkedList, хотя использовать ее практически всегда неправильно). Опять не повезло.

Это все случаи, когда делегирование выигрывает. Это не должно быть более многословным, когда кто-то уже создал базу .


Я бы унаследовал только от ArrayList, если бы была очень веская причина сделать именно это. Возможно, некоторые действительно экстремальные требования к производительности основаны на надлежащих тестах JMH.

...