【问题标题】:Smart way to use inheritance in JavaPoet在 JavaPoet 中使用继承的聪明方法
【发布时间】:2017-03-28 16:26:43
【问题描述】:

我正在尝试以这种方式构建一个类(使用 JavaPoet 库):

theClass = TypeSpec.classBuilder(classe.getName())
                                    .addModifiers(javax.lang.model.element.Modifier.valueOf(classe.getProte().toString().toUpperCase()), Modifier.FINAL) //todo
                                    .addMethods(methods)
                                    .superclass(father)
                                    .addFields(fields)
                                    .build();

“父亲”字段可能什么都不是。我尝试使用将 NULL 放入其中,但它以这种方式给出了异常。没有聪明的写法吗?

我可以写类似的东西

if (father!=null){
   theClass = TypeSpec.classBuilder(classe.getName())
                                .addModifiers(javax.lang.model.element.Modifier.valueOf(classe.getProte().toString().toUpperCase()), Modifier.FINAL) //todo
                                .addMethods(methods)
                                .superclass(father)
                                .addFields(fields)
                                .build();
}
else{
   theClass = TypeSpec.classBuilder(classe.getName())
                                .addModifiers(javax.lang.model.element.Modifier.valueOf(classe.getProte().toString().toUpperCase()), Modifier.FINAL) //todo
                                .addMethods(methods)
                                .addFields(fields)
                                .build();
}

但那不会很好。有什么建议吗?

【问题讨论】:

  • 父亲是否 == null ? Object.class : 父亲的工作?
  • Smartnice 的含义在这种情况下不是很清楚。请在它们的含义中添加一些详细信息。例如,不会很好 因为它添加了重复的代码
  • muzzlator-> 几乎正确:(father==null?ClassName.OBJECT:father) 但非常感谢! @GonzaloMatheu 谢谢!我会记住的!

标签: java javapoet


【解决方案1】:

您可以立即做的一件事来缩短代码是首先使用您想要的大部分字段填充构建器:

public TypeSpec aNiceMethod(
     ClassModel classe, TypeName father, ArrayList methods, ArrayList fields) {

   TypeSpec.Builder theClassBuilder = TypeSpec.classBuilder(classe.getName())
       .addModifiers(
           javax.lang.model.element.Modifier.valueOf(
               classe.getProte().toString().toUpperCase()),
               Modifier.FINAL)
       .addMethods(methods)
       .addFields(fields);
   if (father != null) {
        theClassBuilder.superclass(father);
   }
   return theClassBuilder.build();
}

【讨论】:

  • 很确定这在您编写时不会真正起作用,但是您作为评论编写的“内联 if”非常有用。谢谢! .superclass(father==null?ClassName.OBJECT:father)
  • 很高兴评论有帮助。我很困惑为什么你认为这个答案行不通?我假设您知道我将 theClasstheClassBuilder 切换,因此您需要声明该变量,并且我还使用 return 建议这是您想要结束的对象
  • 是的,我无法让它工作,因为我使用了错误的 Builder 对象。我提出了一个编辑,包含一个 Whole 方法而不是之前的代码,非常感谢
  • 酷,很高兴你能成功。感谢您的编辑,我也删除了一些换行
【解决方案2】:

试试这个:

if (father == null) {
  father = ClassName.OBJECT;
}

JavaPoet 会做正确的事。

【讨论】:

  • .superclass(father==null?ClassName.OBJECT:father) 这可能是最好的方法,非常感谢!
猜你喜欢
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多