【问题标题】:using lombok builder with an abstract class使用带有抽象类的 lombok builder
【发布时间】:2020-04-16 10:08:53
【问题描述】:

我有这个抽象类:

public abstract class Hotel {

     protected List<String> defaultValues() {
        return List.of("Geeks", "For", "Geeks");
    }
}

还有这个从抽象类扩展而来的龙目岛类:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class Hostel extends Hotel {         
    private List<String> values = defaultValues();    

    @SuppressWarnings("unused")
    public static class HosteBuilder {

        public Hostel build() {    
            this.values.add("ww");    
            ...
        }
    }    
}

但我在values.add("ww"); 行中得到一个空指针

【问题讨论】:

  • 这甚至不应该编译。
  • defaultValues() 返回一个 不可变 列表。为什么你认为你可以添加它?不可变意味着某些东西不能改变。增加就是改变。
  • HosteBuilder 不能使用Hostel 的字段values,因为它是一个静态内部类。它不包含对封闭类的引用。
  • 我不想听起来粗鲁,但lombok 不是 Java 初学者工具。在开始使用 lombok 之前,您应该真正熟悉所有 Java 编程语言结构,尤其是当您使用更复杂的 lombok 功能(如@Builder)时。此外,当您必须抑制警告时,在大多数情况下,这表明出现了问题。在这里,您的构建器类名称中有错字。

标签: java nullpointerexception lombok intellij-lombok-plugin


【解决方案1】:

Builder 类需要先创建一个新实例。而且,您使用的列表是不可变的。用户迈克尔已经注意到这两个问题。在任何情况下,lombok 都不应受到责备,因为它只添加了方法,而您在示例中都没有使用。

首先,将列表更改为可变列表类型:

return Arrays.asList(new String[]{"Geeks", "For", "Geeks"});

而扩展类型为:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class Hostel extends Hotel {         
    private List<String> values = defaultValues();    

    @SuppressWarnings("unused")
    public static class HosteBuilder {

        public Hostel build() {
            Hostel hostel = new Hostel();
            hostel.values.add("ww");    
            // ...
            return hostel;
        }
    }    
}

【讨论】:

  • Arrays.asList 其实并不是一个好的选择。它是给定数组的视图。它是可变的,因为元素可以重新排序或替换,但您不能添加元素,因为支持数组是固定大小的。
  • 实际上Arrays.asList 返回一个ArrayList(在Java 8 中),这是一个标准(低内存)列表类型,可以轻松添加元素。支持列表的数组会按需复制到更大的数组中。
  • 如果您要纠正我,请仔细检查您是否正确。它返回一个称为 ArrayList 的类,但它不是大多数人所熟悉的。它是Arrays 中的一个私有静态类,并按照我已经描述的方式运行。这是runnable examplean answer by Jon Skeet explaining the same thing
猜你喜欢
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 2021-07-20
  • 2021-05-18
  • 1970-01-01
  • 2020-08-22
  • 2013-09-01
相关资源
最近更新 更多