可以等于()判断发送的对象是否实际相同?

可以等于()判断发送的对象是否实际相同?

问题描述:

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)); 

} 
  1. 将它总是打印真的吗?
  2. 如果不是在什么情况下不会呢?并有可能使它始终回归真实?
  3. 如果在任何情况下它返回false,您怎么能标记您的mssg对象,以便您可以从服务器返回时识别它?
+4

它取决于您正在传输的运行时对象实例类型的equals()的实现。如果你依赖于Object默认实现,它会根据实例引用 – 2013-04-21 11:36:16

+0

@guido进行测试,并且我猜你的意思是该实例引用不会使其返回true。 – 2013-04-21 11:59:16

+0

对。如果对象类没有实现自己的“equals”方法,那么默认的Object实现只是简单地比较引用 - 就像你用'objA == objB'得到的一样。在这种情况下,objA和objB必须是SAME对象才能“相等”。但是班级认为“平等”取决于班级实施者,并不能保证这两种情况在所有特征上都是相同的。 – 2013-04-21 12:18:12

OSCF主要是发送字符串或字符串数​​组......所以首先检查您的对象是否是serializable

然后有equals方法你需要@Override你为每个类。

1)NO。

2)几乎任何时候它都是假的,你可以尝试发送一个字符串的对象,你应该得到真实。

3)请参阅我的介绍给我的答案。

(这纯粹是基于阅读OSCF网站和Javadoc ...因人而异)

该网站说,OSCF发送和接收可序列普通Java对象(PO​​JO)。由此我推断msg对象可以是任何可序列化类的实例。

在上述情况下,它会始终打印真实?

这是不可能说的。这取决于实际班级如何实施equals

如果不是在什么情况下不会?

不可能说(见上文)。

是否有可能使其始终返回true?

呃...你需要改变你发送/接收的类的方法equals的实现。

如果在所有的情况下返回false ...

这是不可能说如果前提条件成立(见上文)。


底线。 msg是您自己或选择实施的某个类的实例。您可以通过equals行为来实现/选择它,以满足您的需求......包括(显然)与从客户端到服务器往返返回的对象实例的比较。