相关疑难解决方法(0)

属性包括/排除Kotlin数据类

假设我只想在生成的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变成可变的,额外的构造函数定义很难看.

kotlin

27
推荐指数
5
解决办法
6767
查看次数

为什么这个toString()方法导致StackOverFlowError?

我已经从这个这个 答案中理解了你的代码可能进入无限循环导致stackOverFlowError的可能情况,但我不明白如何在这里复制相同的场景,

public class A {
  private B b = new B();
  @Override
  public String toString() {
      return "b "+b;
  }
}

public class B {
  private A a = new A();
  @Override
  public String toString() {
      return "";
  }
}

public class StackoverflowErrorTest {
  public static void main(String[] args) {
     A a = new A();
     System.out.println(a);
  }
}
Run Code Online (Sandbox Code Playgroud)

此代码生成下面的堆栈跟踪: -

Exception in thread "main" java.lang.StackOverflowError
at stackoverflowerror.B.<init>(B.java:5)
at stackoverflowerror.A.<init>(A.java:5)
.
.
.
Run Code Online (Sandbox Code Playgroud)

根据我的理解,当我在main方法中打印对象'a'时,它将调用A类的toString方法,在该方法中,我将返回B类的对象,该对象将隐式调用B类的toString方法.现在,在B类的toString方法中,我返回的是一个空字符串.那么无限循环的范围如何以及在何处进入图片.请解释.

java stack-overflow

8
推荐指数
2
解决办法
821
查看次数

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
查看次数

标签 统计

java ×2

kotlin ×1

lombok ×1

stack-overflow ×1