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类的可扩展性/继承性等,它们确实非常特定于我当前项目的要求。。。我承认这不一定是一种很好的面向对象的类定义方法(通常不是我的方法),但它们在可用性和效率方面最适合我的项目
再次感谢大家
# 1 楼答案
我可以很好地嵌套类。尝试在google中搜索嵌套类:
http://www.javaworld.com/javaworld/javatips/jw-javatip75.html
那是一篇关于它的好文章。但要回答这个问题,不,这不是“坏习惯”,但有特定的时间你会使用它
# 2 楼答案
如果要更紧密地镜像第一个示例,则应使内部类保持静态:
这意味着内部类可以独立创建,并且与外部类无关。否则,每个内部类都将链接到其外部类(并且也可以访问这些类的成员),因此需要从ServerList的上下文中创建
# 3 楼答案
我对此有两个问题:
Server
是这里的重要类,所以它应该是顶级类。将其作为内部类IMHO会使代码不直观,更难理解。(正如@EboMike所指出的,无论采用哪种方式,内部类都应该是static
。)李>ArrayList<Server>
子类化——除了创建一个额外的最小使用类之外,这将它的实现与ArrayList
联系起来,这限制了您将来的选择。我更喜欢在公共接口上声明List<Server>
-程序到接口,而不是实现。它与ServerList
一样可读,而且更有用,因为任何Java程序员都知道它是什么,以及如何使用它李># 4 楼答案
如果你有充分的理由,那么做是技术上的完美
例如,Java映射接口做了一些(不是100%)类似的事情:它有一个内部接口
Map.Entity
,并定义了一个条目集,使用这个内部接口(Set<Map.Entry<K, V>> entrySet()
)无论如何,如果不需要访问内部类中的外部类,那么应该将内部类设置为静态