Enumeration <t>在哪里实施?

时间:2016-07-20 10:58:47

标签: java

我是C#Unity3D开发人员,我最近不得不跳入Java为我正在开发的Android游戏创建一个插件。简而言之,这个插件的目的是使用java网络功能,这样玩家就可以播放他们在手机上托管的匹配,以便其他人在局域网上查找。

对于这个插件,我需要获取设备上的所有网络接口,过滤掉任何本地链路或环回IP,然后(假设只有1个剩余地址,应该有)使用剩余的地址进行广播。我已成功完成了这项工作,但我不禁为这段代码所困扰:

Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();

我最近对事物的内在运作变得更加好奇。 Unity3D有一个很棒的API和文档,但最近我一直在使用附带的IDE(MonoDevelop)来查看他们的托管源代码,以帮助我更好地理解事情是如何完成的,所以这个问题真的只是再次帮助我的好奇心。

因此,Enumeration是一个隐式抽象的接口,它的功能也是如此,这意味着Class必须实现它来定义其函数的行为。

查看docs.oracle.com上的NetworkInterface,它似乎没有实现Enumeration,但它有一个函数(如上所示),它返回一个类型为NetworkInterface的Enumeration,其函数为nextElement()函数。不仅如此,但由于Enumeration是一个界面,一个函数怎么能为我提供一个呢?接口,比如抽象类,无法实例化,但我已经获得了这个Enumeration实例,它具有我可以调用的已定义函数,并且它正在保存我所要求的网络接口。

如果它返回给我一个实现Enumeration的某种(显然是非抽象的)类型的对象,也许持有一个类型为NetworkInterface的私有数组,我想所有这些对我来说都更有意义。

1 个答案:

答案 0 :(得分:3)

  

在docs.oracle.com上查看NetworkInterface,它似乎没有实现Enumeration ...

正确,NetworkInterface 本身实施Enumeration是没有意义的,因为它不是枚举。相反,它有一个内部类,用于实现Enumeration<NetworkInterface>,它是的实例类,您从{{ 1}}。

这是一种常见的模式。您可以在JDK安装中getNetworkInterfaces的{​​{1}}文件中看到实现:

NetworkInterface.java

在这种情况下,它是一个匿名的内部类。其他时候,他们会将内部类命名为src.zip中的public static Enumeration<NetworkInterface> getNetworkInterfaces() throws SocketException { final NetworkInterface[] netifs = getAll(); // specified to return null if no network interfaces if (netifs == null) return null; return new Enumeration<NetworkInterface>() { // This is the private int i = 0; // anonymous public NetworkInterface nextElement() { // inner class used if (netifs != null && i < netifs.length) { // to implement NetworkInterface netif = netifs[i++]; // Enumeration<NetworkInterface> return netif; // } else { // throw new NoSuchElementException(); // } // } // // public boolean hasMoreElements() { // return (netifs != null && i < netifs.length); // } // }; // } (也在Itr中)。