Lombok:非子类不应该不能访问受保护的设置器吗?

Lombok: Shouldn't protected setters not be accessible by non-subclasses?

我是 lombok 的新手,对为什么以下代码编译没有任何错误感到困惑。既然我已经指定 Setter 有 AccessLevel.PROTECTED,难道不应该有某种编译错误吗?

AnotherClass.java

@NoArgsConstructor
@AllArgsConstructor
public class AnotherClass {

    @Getter @Setter
    private int width;

    @Getter(AccessLevel.PUBLIC) @Setter(AccessLevel.PROTECTED)
    private int height;

    @Getter @Setter @NonNull
    private String name;
}

Main.java

public static void main(String[] args) {
    AnotherClass instance1 = new AnotherClass(2, 1, "instance1");
    System.out.println("Fetching height of instance1: " + instance1.getHeight());
    instance1.setHeight(3);
    System.out.println("Fetching height of instance1: " + instance1.getHeight());
}

输出:

Fetching height of instance1: 1
Fetching height of instance1: 3

您可以使用 delombok 检查生成的 setter 是否确实是 'protected'。如评论所示,java 的访问级别是严格提升;每一个更宽松的级别都包括所有访问权限 'below' 它。因此:

  • private = 或多或少:此文件中的所有代码。
  • 无(包私有)= 所有 private + 同一包中的所有源代码。
  • protected = 以上所有 + 子类,甚至在另一个包中。
  • public = 一切。

免责声明:我是 lombok 开发人员。