小编典典

使用列表类型的私有变量帮助Java中的抽象类

java

自从我上次用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()类的方法并进行相应的编码。但是这些类从来没有任何列表,集合或映射,它们只有字符串,整数和浮点数。在这种情况下,我该如何做深拷贝?


阅读 217

收藏
2020-11-23

共1个答案

小编典典

您不需要接受LinkedList<UserProfile>ArrayList<UserProfile>开始的子类。List<UserProfile>建议使用配合还不错(请参阅
Effective Java 2nd Edition,第52项:通过对象的接口引用对象 )。

请记住LinkedList<E> implements List<E>,和ArrayList<E> implementsList<E>,因此,如果您使用List<E>,则可以同时使用(LinkedList<E>ArrayList<E>已经使用的所有其他实现者List<E>)。


关于 clone()

众所周知,这clone()在Java 中已深深地被打破,因此不应该使用(请参阅 有效的Java 2nd Edition,第11项:明智地覆盖克隆
)。

作者乔什·布洛赫(Josh Bloch)的访谈中

如果您已经阅读了我书中有关克隆的内容,尤其是您在两行之间阅读时,您会知道我认为它clone已被深深破坏Cloneable[…]这是一种耻辱Cloneable,但确实发生了。

2020-11-23