【问题标题】:set constructor requirements or static method requirement for abstract class为抽象类设置构造函数要求或静态方法要求
【发布时间】:2022-01-16 14:39:48
【问题描述】:

我有以下问题:

我想要一个抽象类或那种类型的东西,当扩展时,我的 FileLoader 将能够加载它。每个扩展此类型的类都将在启动时加载,并且应该有一种简单的方法来访问这个加载的实例。
我不希望有一个大的哈希图,其中包含扩展我的“可保存”类型的每个类的保存路径。

我有这个抽象类

public abstract class Saveable {
    private String path;
  
    public String getPath() {
        return path;
    }

    public Saveable(String path) {
        this.path = path;
    }
}

还有一个扩展 Saveable 的类

public class Options extends Saveable {
    private String example_property;
    private int example_property2;

    public Options() {
        super("filepath.ending");
    }
}

现在在我的保存实用程序中,当我想将这样的类加载到 java 中时,我使用以下命令:SaveManager.load(Options.class);。在我的加载方法中,我不想创建 Options 的新实例只是为了获取路径,因为调用 new Options() 会做很多其他事情,并且不能保证存在具有“0 arguments”的构造函数。

我可以通过以下方式解决这个问题:

  • 为每个扩展 Saveable 的类设置一个要求,使其具有一个接受 1 个 bool arumgent (bool generateNew) 的构造函数,这样我就可以调用 new Options(false),它会创建一个新类而无需实际“创建一个类”,所以我可以打电话给new Options(false).getPath(),我会得到这个Options类的路径。
    问题是:我无法定义构造函数的要求。
  • 为每个扩展 Saveable 的类设置一个要求,以提供一个返回文件路径的静态函数,但是:这也是不可能的。

有什么想法吗?

【问题讨论】:

    标签: java generics abstract-class


    【解决方案1】:

    只需使用单例设计模式

    public class Options extends Saveable {
        private String example_property;
        private int example_property2;
    
        private Options instance = new Options();
    
        private Options() {
            super("filepath.ending");
        }
        
        public static Options getInstance(){
          return this.instance;
        }
    
    }
    

    然后在保存实用程序调用如下

    SaveManager.load(Options.getInstance());
    

    【讨论】:

    • 有没有办法把getInstance()方法放到Saveable抽象类中?我不想为每个扩展 Saveable 的类编写一个 getInstance() 方法
    • 我不想为数千个类编写相同的代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    相关资源
    最近更新 更多