繁体   English   中英

帮助Java中具有List类型的私有变量的抽象类<E>

[英]Help with abstract class in Java with private variable of type List<E>

自从我上次用Java编写代码以来已经有两年了,所以我的编码技能有点生锈。

我需要将数据(用户配置文件)保存在不同的数据结构ArrayListLinkedList ,它们都来自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()方法并相应地对其进行编码。 但是这些类从来没有任何列表,集合或映射,它们只有字符串,整数和浮点数。 在这种情况下,我该如何做深拷贝?

首先,您不需要使用LinkedList<UserProfile>ArrayList<UserProfile>子类。 建议使用List<UserProfile>还可以(请参见Effective Java 2nd Edition,项目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,第11项:明智地覆盖clone )。

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

如果您已经阅读了本书中有关克隆的内容,尤其是在两行之间阅读时,您会知道我认为clone被严重破坏了。[...]我很少使用Cloneable [。]。 。]可Cloneable被破坏是可耻的,但是它确实发生了。

相关问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM