Помогите с абстрактным классом в Java с закрытой переменной типа List <E> - PullRequest
0 голосов
/ 21 мая 2010

Прошло два года с тех пор, как я последний раз что-то кодировал в Java, поэтому мои навыки кодирования немного устарели.

Мне нужно сохранить данные (профиль пользователя) в различных структурах данных, ArrayList и LinkedListи оба они пришли из List.Я хочу избежать дублирования кода там, где я могу, и я также хочу следовать хорошим практикам Java.

Для этого я пытаюсь создать абстрактный класс, в котором частные переменные будут иметь тип List<E>, а затемсоздать 2 подкласса в зависимости от типа переменной.

Дело в том, что я не знаю, правильно ли я это делаю, вы можете взглянуть на мой код:

Класс: DBList

import java.util.List;

public abstract class DBList {

    private List<UserProfile> listName;
    private List<UserProfile> listSSN;

    public List<UserProfile> getListName() {
    return this.listName;
    }

    public List<UserProfile> getListSSN() {
    return this.listSSN;
    }

    public void setListName(List<UserProfile> listName) {
    this.listName = listName;
    }

    public void setListSSN(List<UserProfile> listSSN) {
    this.listSSN = listSSN;
    }

}

Класс: DBListArray

import java.util.ArrayList;

public class DBListArray extends DBList {

    public DBListArray() {
    super.setListName(new ArrayList<UserProfile>());
    super.setListSSN(new ArrayList<UserProfile>());
    }

    public DBListArray(ArrayList<UserProfile> listName, ArrayList<UserProfile> listSSN) {
    super.setListName(listName);
    super.setListSSN(listSSN);
    }

    public DBListArray(DBListArray dbListArray) {
    super.setListName(dbListArray.getListName());
    super.setListSSN(dbListArray.getListSSN());
    }

}

Класс: DBListLinked

import java.util.LinkedList;

public class DBListLinked extends DBList {

    public DBListLinked() {
    super.setListName(new LinkedList<UserProfile>());
    super.setListSSN(new LinkedList<UserProfile>());
    }

    public DBListLinked(LinkedList<UserProfile> listName, LinkedList<UserProfile> listSSN) {
    super.setListName(listName);
    super.setListSSN(listSSN);
    }

    public DBListLinked(DBListLinked dbListLinked) {
    super.setListName(dbListLinked.getListName());
    super.setListSSN(dbListLinked.getListSSN());
    }

}

1) Имеет ли что-нибудь из этого смысл?Что я делаю неправильно?Есть ли у вас какие-либо рекомендации?

2) Для меня было бы больше смысла иметь конструкторы в DBList и вызывать их (с super()) в подклассах, но я могуне делаю этого, потому что я не могу инициализировать переменную с помощью new List<E>().

3) Мне казалось, что я делаю глубокие копии, когда это возможно, и для этого я всегда перезаписываю clone()метод моих классов и код его соответственно.Но у этих классов никогда не было списков, наборов или карт, у них были только строки, целые числа, числа с плавающей запятой.Как мне сделать глубокие копии в этой ситуации?

1 Ответ

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

Вам не нужны подклассы, для начала которых нужны LinkedList<UserProfile> и ArrayList<UserProfile>.Работать с List<UserProfile> более чем хорошо, рекомендуется (см. Effective Java 2nd Edition, Item 52: Ссылки на объекты по их интерфейсам ).

Имейте в виду, что LinkedList<E> implements List<E>и ArrayList<E> implements List<E>, поэтому, если вы возьмете List<E>, вы можете взять и LinkedList<E>, и ArrayList<E> уже (и всех других разработчиков List<E> там).


Относительноclone()

Теперь понятно, что clone() глубоко поврежден в Java и не должен использоваться (см. Effective Java 2nd Edition, Item 11: разумное переопределение клона ).

Из интервью с автором Джошем Блохом :

Если вы читали статью о клонировании в моей книге, особенно если вы читаете между строк, выбудет знать, что я думаю, clone глубоко сломан [...] Есть очень немного вещей, для которых я больше использую Cloneable [...] Жаль, что Cloneable сломан, но это случается.

Смежные вопросы

...