Java中的通用代码生成

时间:2016-10-06 09:46:28

标签: java swing generics

我正在学习Java(和Swing),并且正在开发一个小代码生成器,它在向您提供一些信息后生成Java类。

第一个窗口询问类名称(必填),母班名称,并询问您是否要生成默认构造函数。按Generate后,会打开JDialog生成的类。

但是我的问题出现在代码生成的通用方面。

保存有关课程的信息后,我会调用generateCode函数,如下所示:

private String generateCode(Information info) {
    String code = "";

    // info contains all the information inputed by the user
    if (info.motherClass.equals("") && info.generateDefaultConstructor == false) {
        code = "public class " + info.name + "{\n\n}";
    } else {

    }
    return code;
}

如您所见,我只处理只给出类名的情况。

我应该如何编码以处理其他选项?应该是一个条件处理一切一个一个?我真的想让我的代码尽可能通用,以便稍后添加更多功能。

谢谢。

2 个答案:

答案 0 :(得分:0)

您可以将信息作为字符串列表进行迭代,并跳过代码生成,其中列表为空字符串。

答案 1 :(得分:0)

首先,我建议制作Information privateprotected添加getterssetters的所有非静态字段。

然后添加一些可以检查和/或操纵Strings的方法,如:

public static String removeSpaces(String input) {
    if (input == null) {
        return "";
    }
    String enter = (char) (13) + (char) (10) + "";
    String tab = (char) (9) + "";
    String space = (char) (32) + "";
    String empty = "";
    return input.replace(enter, empty).replace(tab, empty).replace(space, empty);
}

public static String newLine(){
  return (char) (13) + (char) (10) + "";
}

public static String tab(){
  return (char) (9) + "";
}

然后将generateCode方法拆分为:

private String generateCode(Information info) {
  StringBuilder code = new StringBuilder();
  code.append(getClassCode(info.getMotherClass()));
  code.append(newLine());
  code.append(tab());
  code.append(getConstructor(info));
  return code.toString();
}

public static String getClassCode(String className){
  StringBuilder code = new StringBuilder();
  code.append("public class ");
  if (!removeSpaces(className).isEmpty()){
    code.append(className);  
  } else {
    code.append(Information.getDefaultClass());//have a default static name for a class like "Application"
  }
  code.append("{");
  code.append(newLine());
  return code.toString();
}

public static String getConstructor(Information info){
  StringBuilder code = new StringBuilder();
  if(!info.isGenerateDefaultConstructor()) {
    code.append("public ");
    code.append(info.getMotherClass());
    code.append("(){");
    code.append(newLine());
    code.append(tab());
    code.append(info.getConstructorContent());//what will be in the constructor
    code.append(newLine());
    code.append(tab());
    code.append("}");
  }
  code.append(newLine());
  return code.toString();
}

然后你可以在这里和那里添加点点滴滴继续前进。