Как инициализировать List <E>в пустом конструкторе класса? - PullRequest
4 голосов
/ 21 мая 2010

Следующий код явно не работает, потому что List<E> является абстрактным:

public class MyList {
    private List<E> list;

    public MyList() {
        this.list = new List<E>();
    }
}

Как я могу инициализировать класс MyList пустым конструктором, если мне нужно, чтобы переменная list была LinkedList или ArrayList в зависимости от моих потребностей?

Ответы [ 9 ]

7 голосов
/ 21 мая 2010

Я не уверен, что это то, что вы спрашиваете ...

public class MyList {
    private List<E> list;

    public MyList() {
        if (myNeeds)
            this.list = new LinkedList<E>();
        else
            this.list = new ArrayList<E>();
    }
}
3 голосов
/ 21 мая 2010

Есть лучшие альтернативы тому, чего вы пытаетесь достичь:

  • Создайте базовый класс (абстрактный?) И переопределите его дважды, один раз для ArrayList и один для LinkedList
  • Вставить соответствующий список в ваш класс (внедрение зависимостей)
2 голосов
/ 21 мая 2010

Почему бы не использовать защищенный (и, возможно, abstract метод), например:

public abstract class MyList<T> {

    protected final List<T> list;

    public MyList() {
        list = createList();
    }

    public MyList(boolean preferLinked) {
        list = preferLinked? new LinkedList<T>() : new ArrayList<T>();
    }

    // Allows client code which subclasses from MyList to override the
    // default behaviour

    protected List<T> createList() {
        return new ArrayList<T>();
    }
}
1 голос
/ 21 мая 2010

Список является интерфейсом и поэтому не может быть создан.Могут быть созданы только реализации указанного интерфейса (например, ArrayList).Кроме того, вам нужно знать тип (E) при создании.

Это должно работать:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class MyList<E> {
    private List<E> list;

    public MyList(boolean linked) {
        if (linked) {
            list = new LinkedList<E>();
        } else {
            list = new ArrayList<E>();
        }
    }
}
1 голос
/ 21 мая 2010

Вам необходимо определить, какие «ваши потребности» имеют место в случае по умолчанию - LinkedList или ArrayList. Если вы не можете - скажем, если потребность меняется в зависимости от того, что происходит за время существования объекта, то список тоже нужно изменить.

1 голос
/ 21 мая 2010
boolean shouldThisBeAnArrayList=true; // Set to false to use LinkedList
if(shouldThisBeAnArrayList) {
   this.list = new ArrayList<E>();

}
else {
   this.list=new LinkedList<E>();
}
0 голосов
/ 21 мая 2010
public class MyList<T> {
    private List<T> list = new ArrayList<T>();
}

Это то, что я использую в классах. Я долго инициализировал то, что мог при определении собственной переменной.

0 голосов
/ 21 мая 2010

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

public class MyList {
    private List<E> list;

    public MyList() {
        this.list = new LinkedList<E>();
    }

    //an overload for another type,
    public MyList(bool INeedArray) {
      if (INeedArray)
        this.list = new ArrayList<E>();
    }
}
0 голосов
/ 21 мая 2010

Я думаю, вы могли бы сделать следующее:

public class MyList<T> {
    private List<T> list;

    public MyList() {
        this.list = new ArrayList<T>();
    }
}
...