假设我只想在生成的equals和hashCode实现中包含一个或两个字段(或者可能排除一个或多个字段).对于一个简单的类,例如:
data class Person(val id: String, val name: String)
Run Code Online (Sandbox Code Playgroud)
Groovy有这个:
@EqualsAndHashCode(includes = 'id')
Run Code Online (Sandbox Code Playgroud)
龙目岛有这个:
@EqualsAndHashCode(of = "id")
Run Code Online (Sandbox Code Playgroud)
在Kotlin这样做的惯用方法是什么?
data class Person(val id: String) {
// at least we can guarantee it is present at access time
var name: String by Delegates.notNull()
constructor(id: String, name: String): this(id) {
this.name = name
}
}
Run Code Online (Sandbox Code Playgroud)
虽然感觉不对......我真的不想name变成可变的,额外的构造函数定义很难看.
一切正常,直到我添加toSting()到我的实体类中.
之后我开始在运行时收到以下错误:
Exception in thread "main" java.lang.StackOverflowError
at java.lang.AbstractStringBuilder.append(Unknown Source)
at java.lang.StringBuilder.append(Unknown Source)
at java.lang.StringBuilder.<init>(Unknown Source)
at entity.Guide.toString(Guide.java:51)
at java.lang.String.valueOf(Unknown Source)
at java.lang.StringBuilder.append(Unknown Source)
at entity.Student.toString(Student.java:45)
...
Run Code Online (Sandbox Code Playgroud)
@Entity
public class Teacher {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String name;
@OneToMany(mappedBy="teacher", cascade={CascadeType.PERSIST})
private Set<Student> students = new HashSet<Student>();
public Teacher() {}
public Teacher(String name) {
this.name = name;
}
public Set<Student> getStudents() {
return students;
}
public void addStudent(Student student) {
students.add(student);
student.setTeacher(this);
}
@Override
public String toString() …Run Code Online (Sandbox Code Playgroud)