可以等于()判断发送的对象是否实际相同?
问题描述:
Im使用OCSF框架解释here,假设我使用sendToServer(Object msg)发送originalMssg,它使用java的Object对象与客户端的套接字进行流式处理,然后在服务器端运行sendToClient(Object msg),其中mssg对象和我从那个客户收到的一样。可以等于()判断发送的对象是否实际相同?
现在,请考虑以下的回调,一旦mssg已经从客户端代码的服务器收到回被称为:以上场景
@Override
protected void handleMessageFromServer(Object msg) {
System.out.println(msg.equals(originalMssg));
}
- 将它总是打印真的吗?
- 如果不是在什么情况下不会呢?并有可能使它始终回归真实?
- 如果在任何情况下它返回false,您怎么能标记您的mssg对象,以便您可以从服务器返回时识别它?
答
OSCF
主要是发送字符串或字符串数组......所以首先检查您的对象是否是serializable
。
然后有equals
方法你需要@Override
你为每个类。
1)NO。
2)几乎任何时候它都是假的,你可以尝试发送一个字符串的对象,你应该得到真实。
3)请参阅我的介绍给我的答案。
答
(这纯粹是基于阅读OSCF网站和Javadoc ...因人而异)
该网站说,OSCF发送和接收可序列普通Java对象(POJO)。由此我推断msg
对象可以是任何可序列化类的实例。
在上述情况下,它会始终打印真实?
这是不可能说的。这取决于实际班级如何实施equals
。
如果不是在什么情况下不会?
不可能说(见上文)。
是否有可能使其始终返回true?
呃...你需要改变你发送/接收的类的方法equals
的实现。
如果在所有的情况下返回false ...
这是不可能说如果前提条件成立(见上文)。
底线。 msg
是您自己或选择实施的某个类的实例。您可以通过equals
行为来实现/选择它,以满足您的需求......包括(显然)与从客户端到服务器往返返回的对象实例的比较。
它取决于您正在传输的运行时对象实例类型的equals()的实现。如果你依赖于Object默认实现,它会根据实例引用 – 2013-04-21 11:36:16
@guido进行测试,并且我猜你的意思是该实例引用不会使其返回true。 – 2013-04-21 11:59:16
对。如果对象类没有实现自己的“equals”方法,那么默认的Object实现只是简单地比较引用 - 就像你用'objA == objB'得到的一样。在这种情况下,objA和objB必须是SAME对象才能“相等”。但是班级认为“平等”取决于班级实施者,并不能保证这两种情况在所有特征上都是相同的。 – 2013-04-21 12:18:12