当前位置: 首页 > 面试题库 >

使用列表类型的私有变量帮助Java中的抽象类

易博文
2023-03-14
问题内容

自从我上次用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会自动获取源变量,但我认为,如果所有子类本身都定义了源而不是继承,则读取代码会更容易。 你有什么建议? /亚当 问题答案: 我本以为这样的话会更好,因为您要添加一个变量,所以为什么不限制访问并使它更整洁呢?您的吸气器/装夹器应该按照罐子上的说明去做。 再次提到这个问题,您在阅读时是否会费心