我是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的私有数组,我想所有这些对我来说都更有意义。
答案 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
中)。