0

这基本上是一个 Java 代码转换器。它涉及一个 GUI,让用户输入类类型、名称和方法。为了存储这些值,我创建了一个类VirtualClassArrayList<VirtualClass> classes存储变量boolean isPrivateString classNameString methodName。但是,我发现没有任何内容存储在ArrayList...请帮助我看看有什么问题

下面是类VirtualClass

import java.util.*;

public class VirtualClass {

    private static ArrayList<VirtualClass> classes = new ArrayList<VirtualClass>();
    private boolean isPrivate;
    private String className;
    private String methodName;

    public void setVirtualClass(String name, String method, boolean isP){
        this.className = name;
        this.isPrivate = isP;
        this.methodName = method;
    }

    public void createClass(String name, String method, boolean isP){
        this.className = name;
        this.isPrivate = isP;
        this.methodName = method;
        classes.add(this);
    }

作为参考,这里有一些来自 GUI 的相关代码,可让用户创建类

public class GuiAddClass extends JFrame{
    private VirtualClass stObject;
        ...

private class Handler implements ActionListener{

    public void actionPerformed(ActionEvent event){

        String cName = inputClassName.getText();
        String mName = inputMethodName.getText();
        boolean isP = true;

        if (classObject.checkName(cName) == false){

            JOptionPane.showMessageDialog(null, "Class name invalid. " +
                    "\nEntered name should not contain java keywords or equal to other existing names. " +
                    "\nPlease try again."); 

        } else if (classObject.checkName(cName) == true) {

            JOptionPane.showMessageDialog(null, "Class saved."); 
                    // this message pane has popped up
            cName = inputClassName.getText();
            mName = inputMethodName.getText();

            if (event.getSource() == publicButton) {
                isP = false;
            } else if (event.getSource() == privateButton) {
                isP = true;
            }
            stObject = new VirtualClass();
            stObject.createClass(cName, mName, isP);
        }

    }// end actionPerformed()

}// end Handler class

这是来自另一个类的几个方法,用于显示最终的 javaCode

public String getClassName(){
    String cName = "classname";
    String c = "c";
    for (int i=0; i<classes.size(); i++){
        c = classes.get(i).className;
    }
    cName = c;
    return cName;
}    

public String getMethodName(){
    String mName = "methodname";
    String m = "m";
    for (int i=0; i<classes.size(); i++){
    m = classes.get(i).methodName;
    }
    mName = m;
    return mName;
}

public boolean getIsPrivate(){
    boolean isP = false;
    for (int i=0; i<classes.size(); i++){
        isP = classes.get(i).isPrivate;
    }
    return isP;
}

这是生成Java代码的方法

    public String getJavaCode(){
        String javaCode = (classObject.getPublic() + " class " + 
stObject.getClassName() + stObject.getListSize() + 
"{\n"+"\t"+"public void "+stObject.getMethodName()+"{\n"+"\t}"+"\n}");
        return javaCode;

在我的程序中显示的内容是这样的,其中 c 应该是类名,m 应该是方法名,并且0 = classes.size()

public class c0{
    public void m{
    }
}

任何人都可以帮我找出问题吗?我只是不知道,我收到的答案似乎不起作用。请帮忙!

4

2 回答 2

1

VirtualClass stObject从您发布的信息来看,您开始使用方法似乎很奇怪actionPerformed。这意味着每次您重新创建对象时。

让你VirtualClass stObject成为全球性的,例如:

private VirtualClass stObject;

...

stObject = new VirtualClass();

private class Handler implements ActionListener{

    public void actionPerformed(ActionEvent event){

    ...

   stObject.createClass(cName, mName, isP);
于 2013-10-27T11:30:28.277 回答
0

您的代码有几个问题。但主要是,你的创造逻辑没有多大意义。您不应使用实例的方法将实例添加到静态集合中。我的建议是使用静态工厂方法来做到这一点。像这样的东西:

public class VirtualClass {

private static List<VirtualClass> classes = new ArrayList<VirtualClass>();
private boolean isPrivate;
private String className;
private String methodName;

//A private constructor
private VirtualClass(String name, String method, boolean isP){
    this.className = name;
    this.isPrivate = isP;
    this.methodName = method;
}

private void setClassName(String className){
    this.className = className;
}

private void getClassName(){
    return className;
}

public static VirtualClass createClass(String name, String method, boolean isP){
    VirtualClass virtualClass = new VirtualClass(String name, String method, boolean isP);
    classes.add(virtualClass);
    return virtualClass;
}
}

你的代码现在完成的方式,问题可能在你的客户端类的很多地方。这种结构比较安全,普遍使用。

此外,您不应使用 ArrayList 键入您的集合,而应使用已实现的接口 List。如何使用数组列表?

于 2013-10-27T11:54:28.423 回答