具体来说,让我用 Spring http-remoting 示例来说明这个问题。
假设我们有这样一个简单接口(interface)的实现:
public SearchServiceImpl implements SearchService {
public SearchJdo processSearch(SearchJdo search) {
search.name = "a funky name";
return search;
}
}
SearchJdo 本身就是一个简单的 POJO。
现在,当我们通过http-remoting(Spring调用远程对象的机制,很像使用序列化的EJB)从客户端调用方法时,我们将得到:
public class HTTPClient {
public static void main(final String[] arguments) {
final ApplicationContext context = new ClassPathXmlApplicationContext(
"spring-http-client-config.xml");
final SearchService searchService =
(SearchService) context.getBean("searchService");
SearchJdo search = new SearchJdo();
search.name = "myName";
// this method actually returns the same object it gets as an argument
SearchJdo search2 = searchService.processSearch(search);
System.out.println(search == search2); // prints "false"
}
}
问题是搜索对象因为序列化而不同,尽管从逻辑上看它们是相同的。
问题是是否有一些技术可以支持或模拟跨 VM 的对象标识。
最佳答案
你说过 - 对象标识不同于逻辑相等。
- 对象身份与
==
进行比较 - 与
.equals(..)
比较逻辑相等
因此覆盖equals()
方法,一切都会好起来的。请记住也要基于相同的字段覆盖 hashCode()
。使用您的 IDE 为您生成这 2 个方法。
(Teracotta VM clustering 允许在 VM 之间共享对象,但这不适合您的情况。)
关于java - 如何跨不同 JVM 保留对象标识,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2994113/