相关疑难解决方法(0)

617
推荐指数
11
解决办法
57万
查看次数

是否真的值得为实体类实现toString()

始终建议覆盖(实现)toString()类的方法.

  • Java API文档本身说:"我们建议所有子类重写此方法."
  • 有效Java中的Bloch 具有"始终覆盖toString"项.只有傻瓜才与布洛赫相矛盾,对吧?

然而,我怀疑这个建议:它真的值得toString() 为实体类实现吗?


我会尝试列出我的推理.

  1. 一个实体对象具有唯一的标识; 即使两个entites具有相同的属性值,它也永远不会与另一个对象相同.也就是说,(对于非null x),以下不变量适用于实体类(根据定义):

    x.equals(y) == (x == y)

  2. toString()方法返回一个"文本表示"其对象的字符串(用Java API的话说).

  3. 表示捕获对象的要领,所以如果两个表示是不同的它们是不同的(非当量)对象representaions,反之如果两个represenations是等价它们是等效的对象的表示.这表明以下对于良好表示的不变性(对于非空x,y):

    x.toString().equals(y.toString()) == x.equals(y)

  4. 因此,对于我们期望的实体 x.toString().equals(y.toString()) == (x == y) ,每个实体对象应该具有唯一的文本表示,其toString()返回.某些实体类将具有唯一的名称或数字ID字段,因此它们的toString()方法可以返回包含该名称或数字ID的表示.但一般而言,该toString()方法无法访问此类字段.

  5. 如果没有实体的唯一字段,那么toString()可以做的最好的事情就是包含一个对于不同对象不太可能相同的字段.但是,这是完全的要求System.identityHashCode(),这是什么Object.toString()规定.

  6. 因此,Object.toString()对于那些没有任何数据成员的实体对象确定,但对于大多数类,你会希望包括他们在文中表示,对不对?实际上,您希望包含所有这些:如果类型具有(非null)数据成员x,您可能希望包含x.toString()在表示中.

  7. 但这会对持有对其他实体的引用的数据成员产生问题:即哪些是关联.如果一个Person对象有一个Person father数据成员,那么天真的实现将产生该人的家谱的片段,而不是Person它自己.如果存在双向关联,那么天真的实现将会递归,直到您获得堆栈溢出 …

java debugging tostring

10
推荐指数
2
解决办法
5979
查看次数

nhibernate:实现平等的最佳做法是什么?

我认为实体应该通过主键比较实现相等作为默认值,但是nhibernate文档建议使用业务标识:

最明显的方法是通过比较两个对象的标识符值来实现Equals()/ GetHashCode().如果值相同,则两者必须是相同的数据库行,因此它们是相等的(如果两者都添加到ISet,我们在ISet中只有一个元素).不幸的是,我们不能使用这种方法.NHibernate只会将标识符值分配给持久化的对象,新创建的实例将不具有任何标识符值!我们建议使用Business key equality实现Equals()和GetHashCode().

业务键平等意味着Equals()方法仅比较构成业务键的属性,这是一个在现实世界中标识我们实例的键(自然候选键)

和示例(也来自文档):

public override bool Equals(object other)
{
    if (this == other) return true;

    Cat cat = other as Cat;
    if (cat == null) return false; // null or not a cat

    if (Name != cat.Name) return false;
    if (!Birthday.Equals(cat.Birthday)) return false;

    return true;
}
Run Code Online (Sandbox Code Playgroud)

这让我头晕目眩,因为业务标识的概念(根据示例)与通过语法进行比较相同,这基本上是我与ValueObjects相关联的语义类型.不使用数据库主键作为比较值的原因是,如果未在客户端生成主键(对于ex incremental),则会更改对象的哈希码,并且您使用某种哈希表集合(例如ISet)用于存储您的实体.

我怎样才能创建一个良好的相等实现,它不会破坏相等/ hashcode的一般规则(http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx)并且也符合nhibernate规则?

nhibernate equality

7
推荐指数
1
解决办法
2135
查看次数