自从我上次用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> implementsList<E>
,因此,如果您使用List<E>
,则可以同时使用(LinkedList<E>
和ArrayList<E>
已经使用的所有其他实现者List<E>
)。
clone()
众所周知,这clone()
在Java 中已深深地被打破,因此不应该使用(请参阅 有效的Java 2nd Edition,第11项:明智地覆盖克隆
)。
从作者乔什·布洛赫(Josh Bloch)的访谈中:
如果您已经阅读了我书中有关克隆的内容,尤其是您在两行之间阅读时,您会知道我认为它
clone
已被深深破坏Cloneable
[…]这是一种耻辱Cloneable
,但确实发生了。
假设我有一个叫做book的类,它是抽象的,有一个私有变量price,它的getter方法也是抽象的。 现在让我们假设我有一个旧的Book类,它继承了Book的所有属性,但也有一个与之相关联的年龄。另外,我希望这个类从它的父类重写getPrice方法。这就是我陷入困境的地方,因为price变量是私有的,而父类有一个抽象的getter方法。 谢谢。
假设一个抽象超类包含一个名为price of type double的私有变量。 现在假设变量已声明但未初始化。超类包含访问器方法,但是setter方法是抽象的,因此必须在子类中重写它,但是,由于超变量是私有的,有没有办法从子类初始化此变量? 考虑下面的例子:我有4节课;书籍(抽象超级)、非小说类(sub)、小说类(sub)、测试者(测试发生了什么的类)。 图书类: 小说课 非小说类 公共类非小说
问题内容: 需要对私有变量和继承有更多的了解。较早之前,我的理解是在类中是否有字段,并且当我继承该类时,不受访问(私有变量)限制的字段将存在于继承的类中。但是,如果有公共的g / setter方法,我可以在基类中使用私有变量。 我怎么能想象一个基类中的私有变量? 问题答案: 结果将为10。类A中的私有字段a是B的继承类,但B无法直接访问它。仅通过使用在类A中定义的公共/默认/受保护的访问器方法。B
问题内容: 我来自c#,这很容易而且可能。 我有以下代码: 但是Eclipse告诉我我使用了非法的修饰符。 我有这个课: 我想要以这样的方式定义变量和方法,以使Eclipse 提示我 ,我没有实现抽象 变量 和方法。 我需要如何定义抽象类,以便提示我实现抽象? 编辑1 我将为不同的数据库表创建不同的类。每个类都应具有自己的TABLENAME变量,也不例外。每次创建扩展抽象类的新类时,都必须确保此变
问题内容: 有没有办法从Java通用类的类型变量中获取Class对象?像这样: 此类型信息在编译时可用,因此不受类型擦除的影响,因此,从理论上讲,应该有一种方法来实现此目的。是否存在? 问题答案: 这有效:
问题内容: 让抽象类定义实例变量是否是一种好习惯? 然后,子类ExternalJavaScript.class会自动获取源变量,但我认为,如果所有子类本身都定义了源而不是继承,则读取代码会更容易。 你有什么建议? /亚当 问题答案: 我本以为这样的话会更好,因为您要添加一个变量,所以为什么不限制访问并使它更整洁呢?您的吸气器/装夹器应该按照罐子上的说明去做。 再次提到这个问题,您在阅读时是否会费心