gpt4 book ai didi

java - 如何跨不同 JVM 保留对象标识

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:41:10 25 4
gpt4 key购买 nike

具体来说,让我用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com