【问题标题】:Help with abstract class in Java with private variable of type List<E>使用 List<E> 类型的私有变量帮助 Java 中的抽象类
【发布时间】:2011-02-22 07:49:56
【问题描述】:

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

我需要将数据(用户配置文件)保存在不同的数据结构中,ArrayListLinkedList,它们都来自List。我想尽可能避免代码重复,并且我还想遵循良好的 Java 实践。

为此,我正在尝试创建一个抽象类,其中私有变量的类型为 List&lt;E&gt;,然后根据变量的类型创建 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())对我来说更有意义,但我不能这样做,因为我不能t 用new List&lt;E&gt;() 初始化一个变量。

3) 我被认为尽可能做深拷贝,为此我总是覆盖我的类的clone() 方法并相应地对其进行编码。但是这些类上从来没有任何列表、集合或映射,它们只有字符串、整数、浮点数。在这种情况下我该如何做深拷贝?

【问题讨论】:

    标签: java list arraylist abstract-class linked-list


    【解决方案1】:

    您不应该需要以 LinkedList&lt;UserProfile&gt;ArrayList&lt;UserProfile&gt; 开头的子类。建议使用 List&lt;UserProfile&gt; 非常好(参见Effective Java 2nd Edition,第 52 条:通过接口引用对象)。

    请记住LinkedList&lt;E&gt; implements List&lt;E&gt;ArrayList&lt;E&gt; implements List&lt;E&gt;,因此如果您使用List&lt;E&gt;,您可以同时使用LinkedList&lt;E&gt;ArrayList&lt;E&gt;(以及List&lt;E&gt; 的所有其他实现者) .


    关于clone()

    现在大家都明白clone() 在 Java 中被严重破坏,不应该使用(参见Effective Java 2nd Edition,第 11 条:明智地覆盖克隆)。

    来自an interview with author Josh Bloch

    如果你读过我书中关于克隆的内容,特别是如果你读到字里行间,你就会知道我认为clone 已经被深深地破坏了[...]我使用的东西很少Cloneable 不再 [...] 很遗憾 Cloneable 坏了,但它确实发生了。

    相关问题

    【讨论】:

    • 那么,您是说如果我将LinkedList&lt;&gt;ArrayList&lt;&gt; 传递给DBList 构造函数(如果构造函数将List&lt;&gt; 作为参数)就足以区分它们?是因为它们基本相同,只是内存实现不同?
    • @Nazgulled:为什么需要区分它们?不管实现如何,只处理List&lt;E&gt; 还不够吗?
    • 我还需要为Map&lt;K,V&gt; 做类似的事情,然后有一个TreeMap&lt;K,V&gt; 和一个HashMap&lt;K,V&gt;。在这种情况下我应该只使用Map&lt;K,V&gt; 吗?
    • 我区分它们的意思是如果使用List&lt;E&gt; 足以使实现不同。我真的需要一个是LinkedList,另一个是ArrayList。抱歉,但就像我说的,我的 Java 生锈了。
    • @Nazgulled:然后实现一个接受List 的具体类,并实例化它两次,一次使用ArrayList,另一次使用LinkedList,然后进行比较。您不需要两个单独的类。
    猜你喜欢
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 2023-03-16
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多