情况:
我有一个带有lateinit字段的类,因此它们不在构造函数中:
class ConfirmRequest() {
lateinit var playerId: String
}
Run Code Online (Sandbox Code Playgroud)
我想要一个toString()包含所有字段的方法,并且不想手动编写,以避免锅炉打印.在Java中,我会使用Lombok @ToString注释来解决这个问题.
题:
有没有办法在Kotlin中实现它?
我知道在 Kotlin 类中会自动创建一个 equals 和 hashcode,如下所示:
data class CSVColumn(private val index: Int, val value: String) {
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,有没有办法让实现只使用这些属性之一(例如index),而无需自己编写代码。原本非常简洁的类现在看起来像这样:
data class CSVColumn(private val index: Int, val value: String) {
override fun equals(other: Any?): Boolean {
if (this === other) {
return true
}
if (javaClass != other?.javaClass) {
return false
}
other as CSVColumn
if (index != other.index) {
return false
}
return true
}
override fun hashCode(): Int {
return index
}
}
Run Code Online (Sandbox Code Playgroud)
在带有 Lombok 的 Java 中,我可以执行以下操作: …
一切正常,直到我添加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) 我正在使用Lombok删除样板代码。我正在尝试将实体打印到控制台,但出现StackOverflowError。该实体与另一个实体具有双向关系,因此我想从toString方法中排除该实体。
我的实体看起来像这样:
@Entity
@Data
public class Foo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long fooId;
private String name;
@ManyToOne
@JoinColumn(name = "barId")
@EqualsAndHashCode.Exclude
@ToString.Exclude
private Bar bar;
}
Run Code Online (Sandbox Code Playgroud)
这是我第一次尝试使用@ToString.Exclude它,但似乎没有表现。我使用不正确吗?我只想打印出来fooId,name当我在Foo对象上调用toString时。
编辑
我熟悉从顶级@ToString注释中排除或包含字段的替代方法。我试图避免这种情况。我只想@Data在类级别使用,并注释应排除的字段。
编辑2
仍在简化类上复制。龙目岛1.18.8版本。
假设我有一个具有三个属性的数据类:
data class Product(
val id: Int,
val name: String,
val manufacturer: String)
Run Code Online (Sandbox Code Playgroud)
如果我理解正确的话,Kotlin 将生成equals()并hashCode()使用所有三个属性,如下所示:
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other == null || javaClass != other.javaClass) return false
val that = other as Product?
return id == that.id &&
name == that!!.name &&
manufacturer == that.manufacturer
}
override fun hashCode(): Int {
return Objects.hash(id, name, manufacturer)
}
Run Code Online (Sandbox Code Playgroud)
那么如果我不想id被用在equals()and中怎么办hashCode()?有没有办法告诉 Kotlin 在生成这些函数时忽略某些属性?toString() …