[英]Help with abstract class in Java with private variable of type List<E>
自从我上次用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()
方法并相应地对其进行编码。 但是这些类从来没有任何列表,集合或映射,它们只有字符串,整数和浮点数。 在这种情况下,我该如何做深拷贝?
首先,您不需要使用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 )。
如果您已经阅读了本书中有关克隆的内容,尤其是在两行之间阅读时,您会知道我认为
clone
被严重破坏了。[...]我很少使用Cloneable
[。]。 。]可Cloneable
被破坏是可耻的,但是它确实发生了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.