自从我上次用Java编写代码以来已经有两年了,所以我的编码技能有点生锈。
我需要在不同的数据结构数据(用户配置文件)保存,ArrayList并且LinkedList,他们都来自List。我想避免代码重复,我也想遵循良好的Java惯例。
ArrayList
LinkedList
List
为此,我试图创建一个抽象类,其中私有变量将是类型List<E>,然后根据变量的类型创建2个子类。
List<E>
问题是,我不知道我是否正确执行了此操作,您可以看一下我的代码:
类: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>()。
DBList
super()
new List<E>()
3) 人们一直认为我会尽可能进行深层复制,因此,我总是重写clone()类的方法并进行相应的编码。但是这些类从来没有任何列表,集合或映射,它们只有字符串,整数和浮点数。在这种情况下,我该如何做深拷贝?
clone()
您不需要接受LinkedList<UserProfile>和ArrayList<UserProfile>开始的子类。List<UserProfile>建议使用配合还不错(请参阅 Effective Java 2nd Edition,第52项:通过对象的接口引用对象 )。
LinkedList<UserProfile>
ArrayList<UserProfile>
List<UserProfile>
请记住LinkedList<E> implements List<E>,和ArrayList<E> implementsList<E>,因此,如果您使用List<E>,则可以同时使用(LinkedList<E>和ArrayList<E>已经使用的所有其他实现者List<E>)。
LinkedList<E> implements List<E>
ArrayList<E> implementsList<E>
LinkedList<E>
ArrayList<E>
众所周知,这clone()在Java 中已深深地被打破,因此不应该使用(请参阅 有效的Java 2nd Edition,第11项:明智地覆盖克隆 )。
从作者乔什·布洛赫(Josh Bloch)的访谈中:
如果您已经阅读了我书中有关克隆的内容,尤其是您在两行之间阅读时,您会知道我认为它clone已被深深破坏Cloneable[…]这是一种耻辱Cloneable,但确实发生了。
clone
Cloneable