相关疑难解决方法(0)

Kotlin - 为非数据类生成toString()

情况:

我有一个带有lateinit字段的类,因此它们不在构造函数中:

class ConfirmRequest() {
    lateinit var playerId: String
}
Run Code Online (Sandbox Code Playgroud)

我想要一个toString()包含所有字段的方法,并且不想手动编写,以避免锅炉打印.在Java中,我会使用Lombok @ToString注释来解决这个问题.

题:

有没有办法在Kotlin中实现它?

java tostring kotlin

24
推荐指数
3
解决办法
9258
查看次数

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 中,我可以执行以下操作: …

kotlin

9
推荐指数
1
解决办法
1万
查看次数

JPA:java.lang.StackOverflowError在实体类中添加toString方法

一切正常,直到我添加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)

stack-overflow hibernate tostring jpql jpa-2.1

6
推荐指数
1
解决办法
1万
查看次数

Lombok用@ ToString.Exclude排除字段不起作用

我正在使用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它,但似乎没有表现。我使用不正确吗?我只想打印出来fooIdname当我在Foo对象上调用toString时。

编辑

我熟悉从顶级@ToString注释中排除或包含字段的替代方法。我试图避免这种情况。我只想@Data在类级别使用,并注释应排除的字段。

编辑2

仍在简化类上复制。龙目岛1.18.8版本。

在此处输入图片说明

java lombok

4
推荐指数
2
解决办法
2016
查看次数

生成 equals()、hashCode() 等时忽略某些属性

假设我有一个具有三个属性的数据类:

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() …

kotlin

2
推荐指数
1
解决办法
3962
查看次数

标签 统计

kotlin ×3

java ×2

tostring ×2

hibernate ×1

jpa-2.1 ×1

jpql ×1

lombok ×1

stack-overflow ×1