首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Enumeration<T>在哪里实现?

Enumeration<T>在哪里实现?
EN

Stack Overflow用户
提问于 2016-07-20 10:58:46
回答 1查看 80关注 0票数 0

我是一名C# Unity3D开发人员,最近我不得不跳入Java,为我正在开发的安卓游戏创建一个插件。简单地说,这个插件的目的是使用java网络功能,这样玩家就可以在他们的手机上播放他们所承载的匹配信息,供其他人在局域网上找到。

对于这个插件,我需要获得设备上的所有网络接口,过滤掉任何本地链接或回送I,然后(假设只有一个剩余地址,应该有)使用剩下的地址进行广播。我已经成功地做到了这一点,但是我不得不为我的代码行所困扰:

代码语言:javascript
复制
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();

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

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

查看NetworkInterface on docs.oracle.com,它似乎没有实现枚举,但是它有一个函数(如上面所示),它返回一个带有功能nextElement()函数的NetworkInterface类型的枚举。不仅如此,由于枚举是一个接口,函数如何才能为我提供一个接口呢?接口,像抽象类一样,不能被实例化,但是我得到了这个枚举实例,它具有我可以调用的定义函数,它保存着我所请求的网络接口。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-20 11:01:06

查看NetworkInterface on docs.oracle.com,它似乎没有实现枚举.

没错,NetworkInterface本身实现Enumeration没有多大意义,因为它不是枚举。相反,它有一个用于实现Enumeration<NetworkInterface>的内部类,它是从getNetworkInterfaces接收到的该类的一个实例。

这是一个常见的模式。您可以在JDK安装中的NetworkInterface.java文件中看到src.zip中的实现:

代码语言:javascript
复制
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中)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38479394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档