Java中的泛型代码生成

Java中的泛型代码生成,java,swing,generics,Java,Swing,Generics,我正在学习Java(和Swing),并正在开发一个小型代码生成器,在询问您一些信息后生成Java类 第一个窗口询问类名称(必需),母类名称,并询问是否要生成默认构造函数。按Generate键后,将打开一个带有生成的类的JDialog 但我的问题涉及到代码生成的通用方面 保存有关类的信息后,我调用我的generateCode函数,如下所示: private String generateCode(Information info) { String code = ""; // i

我正在学习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;
}
如您所见,我只处理只给出类名的情况


我应该如何编写代码以处理其他选项?它应该是一块一块处理所有事情的条件吗?我真的希望我的代码尽可能通用,以便以后添加更多功能


谢谢。

您可以将信息制作为字符串列表,并在列表为空字符串时跳过代码生成。

您可以将信息制作为字符串列表,并在列表为空字符串时跳过代码生成。

首先,我建议将
信息
私有
受保护
添加
获取者
设置者

然后添加一些可以检查和/或操作
字符串的方法,如:

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();
}

然后你可以通过在这里和那里添加位和块来继续操作。

首先,我建议将
信息的所有非静态字段设置为private
protected
添加
getter
setters

然后添加一些可以检查和/或操作
字符串的方法,如:

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();
}

然后你可以通过在这里和那里添加比特和片段来继续进行。

“我真的想让我的代码尽可能通用,以便以后添加更多功能。”。我不知道这句话,我咯咯地笑着。你是绝对正确的,但我也在尝试学习通用编码,所以把它看作是一个教训。代码可以无限通用和可定制,但要牺牲可用性(和性能)。您必须决定要支持的用例,然后才能开始使代码通用。“我真的希望使我的代码尽可能通用,以便以后添加更多功能。”。我不知道这句话,我咯咯地笑着。你是绝对正确的,但我也在尝试学习通用编码,所以把它看作是一个教训。代码可以无限通用和可定制,但要牺牲可用性(和性能)。在开始编写通用代码之前,您必须决定要支持的用例。