lombok.Getter cheated me

Posted buguge - Keep it simple,stupid

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lombok.Getter cheated me相关的知识,希望对你有一定的参考价值。

我们熟知的lombok,分为lombok工具和lombok插件

下面这段代码,IDE里正常显示。不过,在build时,会报错。

interface Doable 
    Integer getCode();


@lombok.Getter
class DerivedClass implements Doable 
    int code;

错误信息:

Error:(11, 5) java: DerivedClass不是抽象的, 并且未覆盖Doable中的抽象方法getCode()
Error:(13, 13) java: DerivedClass中的getCode()无法实现Doable中的getCode()
返回类型int与java.lang.Integer不兼容


下面代码,IDE直接在int上标红线,提示错误:\'getCode()\' in \'DerivedClass\' clashes with \'getCode()\' in \'Doable\'; attempting to use incompatible return type

interface Doable 
    Integer getCode();

class DerivedClass implements Doable 

    @Override
    public int getCode() 
        return 1;
    

 

关于OOP中的方法覆写,遵从“一大两小”原则。其中“两小”中的一个“小”是派生类的返回值类型应≤父类。就是说,下面代码是没有问题的。

interface Doable 
    Number getCode();

class DerivedClass implements Doable 

    @Override
    public Integer getCode() 
        return 1;
    

 

 

关于lombok的@Getter注解。首先要知道,我们熟知的lombok,分为lombok工具和lombok插件(IDEA插件:IntelliJ Lombok plugin)。lombok工具在代码编译期为类生成相应的方法代码,lombok插件是为类IDE增强类里的方法,就是说,lombok为类生成相关方法签名(就像我们人肉为类添加的方法那样,只不过插件是自动生成的),并告诉IDE。像上面的案例中,IDEA就检测到DerivedClass类中有getCode方法,所以不会给出错误提示。而在编译期,lombok工具为DerivedClass生成了int getCode方法,这时,IDEA编译器发现因不符合java覆写原则而报错。

之所以分享这个知识点,则源自昨天的一段代码。 我在项目中新增了一个枚举类PlatOrderInTypeEnum,见下面代码,其中的EnumAbility<T>中有T getCode();方法。自然是想不到会有什么问题。结果在部署到测试环境时,Jenkins构建时出现如下maven compile error。

/***
 * T_Plat_order表IN_TYPE枚举--用来标记交易来源 (API/客户提交/运营提交)
 * @author zhangguozhan
 * 2023-5-15 17:46:02
 */
@Getter
@AllArgsConstructor
@EnumGetByCode
public enum PlatOrderInTypeEnum implements EnumAbility<Integer> 
    API(1, "结算接口提交"),
    MERCHANT(0, "结算后台提交"),
    BOSS(2, "运营后台导入");

    private Integer code;
    private String description;

Jenkins错误截图

 

在Java枚举中使用lombok @Getter注解[重复]。

我试图使用一个枚举作为地图,从alpha-2国家代码中检索国家名称。我有一个这样的枚举类。

public enum Country {
    AF("Afghanistan");

    @Getter
    private final String fullName;

    private Country(String fullName) {
      this.fullName = fullName;
    }

}

我想如果我把一个新的国家对象实例化,比如说:

String country = new Country("AF").getFullName();

变量 country 应该设置为 "阿富汗",但我得到一个错误信息,即该对象不能是 Country 不能被实例化。

答案

检查这个 https:/stackoverflow.coma168514223874879。Enums不能被实例化,它们就像一个常量,你必须在编译时定义它们,我想。

另一答案

枚举是一个特殊的 "类",它代表了一组常量(不可改变的变量,比如最终变量)。

你可以用点阵法访问枚举常量。

String country = Country.AF.getFullName();

枚举常量是公共的,静态的和最终的。你不能使用以下方法创建枚举实例 new.

枚举常量 (AF 在你的例子中)是你唯一可以使用的实例。

另一答案

你不能创建一个对象。

检查这个文档。https:/docs.oracle.comjavase7docsapijavalangEnum.html。

试试这个。String country = Country.AF.getFullName();

EDIT: 如果你想用一个变量来代替硬编码的字符串,你可以定义一些方法,如 findByCountryCode(countryCode) 在你的枚举中

public Country findByCountryCode(String code) {
    for (Country value : Country.values()) {
        if (value.getFullName().equals(code)) {
            return value;
        }
    }
    return null;
}

以上是关于lombok.Getter cheated me的主要内容,如果未能解决你的问题,请参考以下文章

在Java枚举中使用lombok @Getter注解[重复]。

cheat engine如何设置中文版

Linux和MAC命令参数用法查询工具:cheat

cheat-linux命令行实用助记工具

微信内存小程序code获取cheatengine

cheat命令安装与使用