Рефакторинг списка <Foo>в FooList - PullRequest
1 голос
/ 12 сентября 2009

У меня есть несколько коллекций классов, которые мне нужно преобразовать в новые классы. Я использую Java с Eclipse или Netbeans. В настоящее время я создаю новый класс FooList с делегатом List , а затем прослеживаю все места, где код не удается скомпилировать. Есть ли способ сделать это, не нарушая код (и желательно одну операцию)?

РЕДАКТИРОВАТЬ У меня есть следующий тип конструкции:

public static List<Foo> Bar.createFooList(String s)

и List<Foo> часто используются в других местах, и это имеет смысл как бизнес-объект FooList. Я сделал это вручную:

public class FooList {
    private List<Foo> fooList;
    public FooList(String s) {
        createList(s);
    }
    private void createList(String s) {//...}
    public int size() {return fooList.size();}
}

FooList также будет иметь методы за пределами List. Например подарок:

Bar.normalize(List<Foo> fooList);

станет

fooList.normalize();

Там, где другой функции нужны методы List, я использовал опцию Source | Generate Delegate Methods в Eclipse для генерации этих методов в FooList (как с size () выше).

Я вижу привлекательность @JonSkeet в реализации List , но не вижу, как автоматически изменить весь мой код.

Ответы [ 3 ]

9 голосов
/ 12 сентября 2009

Есть ли причина не делать FooList орудие List<Foo>?

3 голосов
/ 12 сентября 2009

У вас есть List<Foo>, который является выразительным представлением списка недругов. Единственная причина, по которой я могу избавиться от List<Foo>, заключается в ограничении или управлении некоторыми операциями со списком доступа.

В случае limit - вы не можете наследовать от List<Foo>, и, как правило, нет хороших случаев для наследования List, кроме пользовательских списков для создания пользовательских алгоритмов.

Как я понимаю, Foo - это какой-то бизнес-объект. В этом случае ListOfFoo должен оставаться как бизнес-объект, а не как List.

В случае control - делайте делегирование, как вы. Eclipse или Netbeans - ваши друзья в этом процессе.

Но подумай еще раз. List<Foo> - это уже красивый информационный мир. Это не то же самое, что C ++ std::list<Foo>, который нужно обернуть в любом случае.

1 голос
/ 12 сентября 2009

Я только что попробовал это в IntelliJ и не увидел ничего, что было бы прямым рефакторингом. Но это может сделать это:

  1. Создайте свой FooList примерно так:

    открытый абстрактный класс BarList реализует список {}

  2. Выполните глобальный поиск и замените «List<Foo>» на «FooList».

  3. Теперь вы отправились на гонки.

Теперь вы можете использовать имеющиеся у вас рефакторинги, такие как (IntelliJ) "Заменить конструктор фабричным методом" и т. Д.

Это работает?

...