无法在类对象的ArrayList中存储值。 (编辑编辑)

时间:2013-10-27 11:23:36

标签: java class oop object arraylist

这基本上是一个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{
    }
}

有人能帮我解决问题吗? 我只是不知道,我收到的答案似乎不起作用。请帮忙!

2 个答案:

答案 0 :(得分: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); 全球,例如:

{{1}}

答案 1 :(得分:0)

您的代码存在一些问题。但主要是,你的创造逻辑没有多大意义。您不应该使用实例的方法将实例添加到Static集合中。我的建议是使用静态工厂方法来做到这一点。取而代之的是:

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。 how to use an array list?