【问题标题】:How to associate arbitrary data with object in Java如何将任意数据与Java中的对象相关联
【发布时间】:2012-11-28 02:35:09
【问题描述】:

我正在使用naga 进行一些异步套接字编程。

但是我需要能够将任意数据附加到 Socket 对象。

例如我有这样的代码:

service = new NIOService();
// Server is JSONObject
NIOSocket socket = service.openSocket(Server.getString("ip"), Server.getInt("port"));
??? Add mydata to socket
socket.listen(observer); // See class below
System.out.println(socket.mydata);// get new data


public static class Observer extends SocketObserverAdapter {

        //Called when Socket makes connection
        @Override
        public void connectionOpened(NIOSocket socket) {
            System.out.println(socket.mydata); // get data
            socket.mydata = "yay!";// set data
        }
}

我遇到的问题是我需要在Observer.connectionOpened 回调中获取和设置套接字对象上的数据,并且以后能够访问它。

我意识到可能没有办法只向对象添加数据,但是将数据与对象关联以便我可以传递它并仍然访问(和修改)数据的最佳方法是什么?

我总是可以重新编译类代码以将变量添加到类中,但这似乎很老套,我尽量避免这样做。

注意:我对 Java 编程相当陌生,但对一般编程并不熟悉。

【问题讨论】:

    标签: java android oop


    【解决方案1】:

    想到的两种方法是:

    将 Socket 包装在一个携带信息的类中

    class MySocketWithData {
        private final Socket theSocket;
        private String myData;
        ....
    }
    

    或者,维护一个Map 来保存您关心的信息。

    private final Map<Socket, MyCoolData> socketMap = new ConcurrentHashMap<>();
    public void doSomething(Socket sock) {
        MyCoolData data = socketMap.get(sock);
    }
    

    我可能更喜欢第一个。如果您需要在自己周围传递 Socket 实例并且不能替换您自己的类,则第二种方法会更合适。

    【讨论】:

    • 不幸的是,我必须传递对象,但第二个选项会很好用。使用 Map 与说 HashMap 有什么优势吗? (我意识到 HashMap 就像一个子类或排序......效率更高吗?)
    • Map 是接口,HashMap 是实现。还有其他实现,例如 TreeMap,但其中大多数可能不适合 Sockets。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 2021-08-01
    相关资源
    最近更新 更多