【问题标题】:Reverse engineering generate ==, not equals逆向工程生成==,不等于
【发布时间】:2013-10-11 17:56:06
【问题描述】:

我的团队在当前项目中使用 Hibernate Tools 4.0.0,而我正在使用 FindBugs。它表明生成的 ORM 代码的 equals 方法正在使用 == 而不是 equals

我搜索了但找不到如何更改它。据我了解,不应该用equals 代替== 吗?如果是这样,该怎么做(通过hibernate.reveng.xml 或其他方式)?

更新: 我需要向右滚动才能看到生成的其余代码行。结果是,被标记的第一部分 正在 进行内存引用。但是,它与使用equals 的比较进行或运算。所以这只是一个需要仔细阅读的案例。

【问题讨论】:

    标签: java hibernate code-generation hibernate-tools


    【解决方案1】:

    这取决于所比较的内容。 == 在处理对象时比较引用,而.equals() 比较对象的值(如果这些对象支持.equals())。

    对于生成的代码,== 可能被适当地使用。当然,这取决于上下文。

    【讨论】:

    • 因为这是一个 id 类,更具体地说是表的主键。我假设它正在处理对象值,而不是引用。如果它们的 java 引用不同,那么说两件事不相等是没有意义的。数据库不这么看;)另外,我理解这是覆盖Objectequals,它再次处理值,而不是引用。
    • 虽然我猜另一种看待这个问题的方式是,Hibernate 认为对象是相同的,除非它们的引用相同?我不知道为什么这真的让我很困扰,但我似乎无法在网上找到任何东西......这通常意味着我的理解是错误的。这没有任何意义。
    • 示例:String a = "someString"; String b = a; if (a == b) { System.out.println("Same reference!"); } 打印“相同的参考!”因为 a 和 b 对象都引用相同的内存位置(类似于指针)。
    • String a = "someString"; String b = "someString"; if (a == b) { System.out.println("Same reference!"); } 打印“相同的参考!”此外,由于 jvm 在后台做了一些魔术并缓存了字符串文字对象。所以现在你在内存中有两个对同一事物的引用。
    • 但是 -- String a = "someString"; String b = new String"someString"); if (a == b) { System.out.println("Same reference!"); } 不打印任何东西,因为new String() 在内存中创建了一个新对象并将 b 的引用设置为指向它。
    猜你喜欢
    • 2011-07-27
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2013-12-14
    相关资源
    最近更新 更多