Java中的泛型代码生成
我正在学习Java(和Swing),并正在开发一个小型代码生成器,在询问您一些信息后生成Java类 第一个窗口询问类名称(必需),母类名称,并询问是否要生成默认构造函数。按Generate键后,将打开一个带有生成的类的Java中的泛型代码生成,java,swing,generics,Java,Swing,Generics,我正在学习Java(和Swing),并正在开发一个小型代码生成器,在询问您一些信息后生成Java类 第一个窗口询问类名称(必需),母类名称,并询问是否要生成默认构造函数。按Generate键后,将打开一个带有生成的类的JDialog 但我的问题涉及到代码生成的通用方面 保存有关类的信息后,我调用我的generateCode函数,如下所示: private String generateCode(Information info) { String code = ""; // i
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();
}
然后你可以通过在这里和那里添加比特和片段来继续进行。“我真的想让我的代码尽可能通用,以便以后添加更多功能。”。我不知道这句话,我咯咯地笑着。你是绝对正确的,但我也在尝试学习通用编码,所以把它看作是一个教训。代码可以无限通用和可定制,但要牺牲可用性(和性能)。您必须决定要支持的用例,然后才能开始使代码通用。“我真的希望使我的代码尽可能通用,以便以后添加更多功能。”。我不知道这句话,我咯咯地笑着。你是绝对正确的,但我也在尝试学习通用编码,所以把它看作是一个教训。代码可以无限通用和可定制,但要牺牲可用性(和性能)。在开始编写通用代码之前,您必须决定要支持的用例。