【问题标题】:Eclipse template variable for getter and settergetter 和 setter 的 Eclipse 模板变量
【发布时间】:2012-06-12 18:09:05
【问题描述】:

我有一个小问题。我正在尝试为 Eclipse 中的变量创建 getter 模板。我想要在我的 getter 方法中做的是检查变量是否为空。如果它是空的,我想给它赋值。但是问题是我需要将方法的返回值转换为 getter 返回类型。我无法管理它。这是我想要的代码:

Integer someInt;
Double someDoub;
Long someLong;

public Integer getSomeInt(){
    if(someInt == null) someInt = (Integer) new Generator().evaluate();
    return someInt;
}

public Double getSomeDoub(){
    if(someDoub == null) someDoub = (Double) new Generator().evaluate();
    return someDoub;
}

这是我要生成的代码。 这是我作为模板输入的内容:

if( ${field} == null){
    ${field} = ( ${return_type} ) new Generator().evaluate();
}
return ${field};

只要我输入这个。 Eclipse 说 return_type 是未知的。请帮忙。

非常感谢您的宝贵时间。

【问题讨论】:

    标签: java eclipse casting getter eclipse-templates


    【解决方案1】:

    Eclipse 没有提供在 getter/setter 代码模板(即“生成 Getter 和 Setter”工具使用的模板)中执行此操作的方法。 “插入变量”列表中的变量是唯一受支持的变量。

    ${return_type} 仅可用于常规模板(即,您可以使用代码完成热键调用的类型)。

    作为一种可能的解决方法,您可以创建一个通用的静态工厂方法来生成默认对象,从而避免强制转换:

    public class MyBean {
        Integer someInt;
        Double someDoub;
    
        public Integer getSomeInt(){
            if (someInt == null) someInt = GeneratorUtil.createAndEvaluate();
            return someInt;
        }
    
        public Double getSomeDoub(){
            if (someDoub == null) someDoub = GeneratorUtil().createAndEvaluate();
            return someDoub;
        }
    }
    
    public class GeneratorUtil {
        @SuppressWarnings("unchecked")
        public static <T> T createAndEvaluate() {
            return (T) new Generator().evaluate();
        }
    }
    

    您的Generator 类是否使用某种类型的反射来确定要生成哪种类型的对象?

    【讨论】:

    • 不,我没有使用反射。我有一堆 POJO 类,它们的名称与变量名相同。我给出的代码 sn-p 实际上并不是我所拥有的,只是为了简化问题。在我的情况下,“生成器”类因变量而异,所有这些变量都实现了一个包含评估方法签名的接口。所以我不能有一个实用程序类。不过谢谢你的想法。
    • @Mehmet Yesin:你能发布你的生成器类代码吗?这将有助于我们为您提供更合适的答案。我认为您要实现的目标很难通过 getter 模板实现
    • @MehmetYesin 那么您是想让 getter 模板放入正确的生成器类中,还是打算为每个 getter 编写正确的生成器?
    • 让我这样解释。有许多类(很多)代表一些数据。所有这些类都实现了评估方法并返回一个具体类型。 Integer、Double、Boolean、Long 或 String。在我的模板中,我实际上是在说 ${field} = ( RETURN_TYPE ) new ${field}.evaluate();因为我的类的名称与变量名相同,这是部分封装了它们。希望我解释得更好一点。对不起,我创造了混乱。
    • 是否可以修改您的生成器接口以进行通用化?类似于interface Generator&lt;E&gt; { E evaluate(); },因此每个生成器类都会指定它生成的对象类型,例如class SomeIntGenerator implements Generator&lt;Integer&gt; { public Integer evaluate() { return 0; } }
    【解决方案2】:

    这将完成你的工作:

     if( ${field} == null){
            ${field} =   ${field}.getClass().cast( new Generator().evaluate());
        }
        return ${field};
    

    【讨论】:

    • 一个好主意,但正如所写的那样,这将不起作用,因为如果该字段为空,您不能在其上调用getClass()。您可以将evaluate 的结果存储到一个临时的Object 变量中,然后调用getClass() 进行转换。
    • 哎呀..我完全错过了..很好的赶上@matts。但是如果我们从 evaluate 创建 temp obj 并对其执行 getClass ,它将返回 Object 而不是 Integer
    • 哦,开枪,你是对的。我在想对象的getClass() 仍会返回正确类型的Class 对象。但是编译器仍然只知道cast 方法返回了Object,即使它在运行时确实返回了Integer。我想这也行不通……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 2015-02-28
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多