有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java扩展ArrayList<E>当E是ArrayList本身的嵌套类时。。。这是错的吗?

首先,这是一个Java问题,请原谅第一个与C相关的解释

我最近一直在使用C#where one。cs源文件可以包含多个类定义,例如

// Servers.cs

public class Server {
}

public class ServerList : ArrayList <Server> {
}

我这样做是因为它减少了源文件的数量,并将两个类保持在一起

在Java中,当然是一对一。java文件,但我有如下嵌套服务器类的想法

//Servers.java
public class ServerList extends ArrayList<ServerList.Server> {

    // Edited to make Server class 'static'
    public static class Server implements Serializable {
    }
}

这个版本没有编译时错误或警告,但我不能决定它是否正确

我看得越多,我就越高兴,但我仍然担心这可能被认为是不好的做法,或者我可能会遇到问题

所以问题是。。。这样可以吗?对不起,如果这是一个菜鸟java问题(或者甚至是新手OOP问题——尽管使用OOP回到90年代中期C++,我是自学的,从来没有尝试过这样的事情)。p>

编辑:

非常感谢所有对此问题提出意见/建议的人

首先,我编辑了我的代码,使服务器类成为静态的-我希望我会发现这一点,但从一开始就知道我应该以这种方式处理它,这是很好的

要扩展与其他评论相关的内容

我有理由扩展ArrayList,而不是在关联代码中使用ArrayList(或List)。我没有包含代码(尚未启动),但ServerList将封装服务器对象的特定处理(包括搜索特定于服务器的字段/成员)

另外,我使用的是ArrayList而不是List,因为我将使用ServerList的一个实例绑定到Android Spinner小部件(ArrayAdapter非常简单)。很抱歉,我没有提到Android,但我的问题(在我看来)是针对Java实践的,而不是针对我选择的类来实现我想做的事情

至于其他程序员(或我自己)在以后使用Server或ServerList类的可扩展性/继承性等,它们确实非常特定于我当前项目的要求。。。我承认这不一定是一种很好的面向对象的类定义方法(通常不是我的方法),但它们在可用性和效率方面最适合我的项目

再次感谢大家


共 (4) 个答案

  1. # 2 楼答案

    如果要更紧密地镜像第一个示例,则应使内部类保持静态:

    public class ServerList extends ArrayList<ServerList.Server> {
    
        public class static Server implements Serializable {
        }
    }
    

    这意味着内部类可以独立创建,并且与外部类无关。否则,每个内部类都将链接到其外部类(并且也可以访问这些类的成员),因此需要从ServerList的上下文中创建

  2. # 3 楼答案

    我对此有两个问题:

    • 因为Server是这里的重要类,所以它应该是顶级类。将其作为内部类IMHO会使代码不直观,更难理解。(正如@EboMike所指出的,无论采用哪种方式,内部类都应该是static。)
    • 我看不出有什么好的理由将ArrayList<Server>子类化——除了创建一个额外的最小使用类之外,这将它的实现与ArrayList联系起来,这限制了您将来的选择。我更喜欢在公共接口上声明List<Server>-程序到接口,而不是实现。它与ServerList一样可读,而且更有用,因为任何Java程序员都知道它是什么,以及如何使用它
  3. # 4 楼答案

    如果你有充分的理由,那么做是技术上的完美

    例如,Java映射接口做了一些(不是100%)类似的事情:它有一个内部接口Map.Entity,并定义了一个条目集,使用这个内部接口(Set<Map.Entry<K, V>> entrySet()

    无论如何,如果不需要访问内部类中的外部类,那么应该将内部类设置为静态