java静态变量继承-如何改进代码?

java静态变量继承-如何改进代码?,java,Java,我有一些类似的课程: class resourceA { public static String ResPath="c:/somethingA"; private double [] data; public void load(String fileName) { //Load data[] from ResPath+"/"+fileName } public void save(String fileName)

我有一些类似的课程:

class  resourceA
{
    public static String ResPath="c:/somethingA";

    private double [] data;

    public void load(String fileName)
    {
        //Load data[] from ResPath+"/"+fileName
    }

    public void save(String fileName)
    {
        //Save data[] to ResPath+"/"+fileName
    }

    public static String [] list()
    {
        return (new File(ResPath)).list(); 
    }
}

还有3个类似的班级。请注意,每个类都有不同类型的私有数据,因此保存和加载是特定于它们的

因此,我希望使用继承编写更少的代码,如下所示:

class abstract resourceGeneric
{
    public static String ResPath="c:/somethingB";

    public abstract void load(String fileName);

    public abstract void save(String fileName);

    public static String [] list()
    {
        return (new java.io.File(ResPath)).list(); 
    }

}

class resourceA extends resourceGeneric
{
    private double [] data;

    public void load(String fileName)
    {
        //Load data[] from ResPath+"/"+fileName
    }

    public void save(String fileName)
    {
        //Save data[] to ResPath+"/"+fileName
    }
}

class resourceB extends resourceGeneric
{
    private int [] data;

    public void load(String fileName)
    {
        //Load data[] from ResPath+"/"+fileName
    }

    public void save(String fileName)
    {
        //Save data[] to ResPath+"/"+fileName
    }
}
其他3个班也一样

这将防止为每个类重写相同的list方法,同时拥有一种公共接口或行为,所有继承的类都必须实现load和save方法

一切看起来都很好,但我执行此操作时出错:

resourceA.ResPath="A";
resourceB.ResPath="B";
resourceA.list();
在本例中,resourceA.list在B而不是A中搜索文件,因为ResPath是父类resourceGeneric的静态变量

我可以为每个类声明ResPath,但在本例中,resourceGeneric.list无法知道哪个路径代码是不可编译的

由于这没有达到预期的效果,如果可能的话,我想就如何修复它或者如何为我的原始类编写更好的代码提出一些建议


提前谢谢

如果希望类遵循此结构,则不要声明ResPath static,并在一个实现类构造函数中设置其值,如下所示:

class abstract resourceGeneric
{
    protected String ResPath;    // Dont declare ResPath static
    public abstract void load(String fileName);
    public abstract void save(String fileName);

    public static String [] list()
    {
        return (new java.io.File(ResPath)).list(); 
    }
}
那么基类可以是:

class resourceA extends resourceGeneric
{
    private double [] data;

    public resourceA(String resPath){ 
        this.ResPath = respath;
    }

    public void load(String fileName)
    {
        //Load data[] from ResPath+"/"+fileName
    }

    public void save(String fileName)
    {
        //Save data[] to ResPath+"/"+fileName
    }
}

由于静态变量是一个指向抽象类中单个位置的指针,因此您正在使用

resourceA.ResPath="A";
resourceB.ResPath="B";
resourceA.list();
实际上是在内存中设置相同的位置两次。resourceA.ResPath和resourceB.ResPath指向内存中的同一位置

通常不鼓励使用静态变量,访问和修改公共变量也是如此。但是如果你想坚持这种方法,这里有一个建议

class abstract resourceGeneric
{
    private static List<String> ResPaths=new ArrayList<String>();
    private String ResPath;

    public abstract void load(String fileName);

    public abstract void save(String fileName);

    public void setResPath(String ResPath) 
    {
        ResPaths.add(ResPath);
        this.ResPath = ResPath;    
    }

    public static String [] list()
    {
        return ResPaths.toArray(new String[ResPaths.size()]);
    }

}

它应该为您提供路径A和B。

您不能拥有与类及其任何子类不同的公共静态数据。如果这是你想要实现的,你必须:

在每个子类中都有私有静态数据 在抽象父类中具有抽象的非静态getter和optionalsetter 在子类中具有非静态重写getter和optionally setter 如果有意义,您甚至可以使用泛型在父级中创建数据、加载和保存:

class abstract resourceGeneric<T>
{
    T data[];

    public void load(String fileName)
    {
        //Load T data[] from getResPath()+"/"+fileName
    }

    public void save(String fileName)
    {
        //Save T data[] to getResPath()+"/"+fileName
    }

    public String [] list() // can no longer be static
    {
        return (new java.io.File(getResPath())).list(); 
    }

    public abstract getResPath();
}

class resourceA extends resourceGeneric<Double>
{
    private static ResPath = "c:/somethingA";

    public getResPath() {
        return ResPath;
    }
}

class resourceB extends resourceGeneric<Integer>
{
    private static ResPath = "c:/somethingB";

    public getResPath() {
        return ResPath;
    }
}

但它强制使用相应的装箱类替换内部数组。如果这样做,或者如果使load和save泛型不合适,只需将它们放在具体的子类中即可

上面的帖子表明,只有一个类具有非静态resPath变量是最好的,但这是基于我对您的问题和实际代码的有限理解。只是路径不同吗?或者所有的方法都是完全不同的吗?为什么不使用泛型呢?因此,您可以使用所需的数据类型创建resourceA类,与resourceB数据类型不同。这应该有帮助:作为旁白,你需要学习和使用。变量名都应该以小写字母开头,而类名应该以大写字母开头。学习这一点并遵循这一点可以让我们更好地理解您的代码,也可以让您更好地理解其他人的代码。
resourceA.setResPath("A");
resourceB.setResPath("B");
resourceA.list();
class abstract resourceGeneric<T>
{
    T data[];

    public void load(String fileName)
    {
        //Load T data[] from getResPath()+"/"+fileName
    }

    public void save(String fileName)
    {
        //Save T data[] to getResPath()+"/"+fileName
    }

    public String [] list() // can no longer be static
    {
        return (new java.io.File(getResPath())).list(); 
    }

    public abstract getResPath();
}

class resourceA extends resourceGeneric<Double>
{
    private static ResPath = "c:/somethingA";

    public getResPath() {
        return ResPath;
    }
}

class resourceB extends resourceGeneric<Integer>
{
    private static ResPath = "c:/somethingB";

    public getResPath() {
        return ResPath;
    }
}