我是一名C# Unity3D开发人员,最近我不得不跳入Java,为我正在开发的安卓游戏创建一个插件。简单地说,这个插件的目的是使用java网络功能,这样玩家就可以在他们的手机上播放他们所承载的匹配信息,供其他人在局域网上找到。
对于这个插件,我需要获得设备上的所有网络接口,过滤掉任何本地链接或回送I,然后(假设只有一个剩余地址,应该有)使用剩下的地址进行广播。我已经成功地做到了这一点,但是我不得不为我的代码行所困扰:
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();最近我对事物的内部运作越来越好奇了。Unity3D有一个很好的API和文档,但是最近我一直在使用包含的IDE (MonoDevelop)来查看他们的托管源代码,以帮助我更好地理解事情是如何完成的,所以这个问题真的再次帮助了我的好奇心。
因此,枚举是一个隐式抽象的接口,它的函数也是抽象的,这意味着类必须实现它来定义其函数的行为。
查看NetworkInterface on docs.oracle.com,它似乎没有实现枚举,但是它有一个函数(如上面所示),它返回一个带有功能nextElement()函数的NetworkInterface类型的枚举。不仅如此,由于枚举是一个接口,函数如何才能为我提供一个接口呢?接口,像抽象类一样,不能被实例化,但是我得到了这个枚举实例,它具有我可以调用的定义函数,它保存着我所请求的网络接口。
如果它返回给我一个实现枚举的(显然是非抽象的)类型的对象,也许持有一个类型为NetworkInterface的私有数组,我认为所有这些都对我来说更有意义。
发布于 2016-07-20 11:01:06
查看NetworkInterface on docs.oracle.com,它似乎没有实现枚举.
没错,NetworkInterface本身实现Enumeration没有多大意义,因为它不是枚举。相反,它有一个用于实现Enumeration<NetworkInterface>的内部类,它是从getNetworkInterfaces接收到的该类的一个实例。
这是一个常见的模式。您可以在JDK安装中的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 in AbstractList.java (也在src.zip中)。
https://stackoverflow.com/questions/38479394
复制相似问题