0

我不确定我是否问对了,因为我正在尝试自学 Java。我有一个包含我的主要方法的类,并且在这个类中有几个需要使用 java.util.Properties 访问我的用户设置的子类。我必须在每个子类中创建属性对象才能使其工作,并且我无法使用 configFilePath 引用该对象,它必须为空。我想知道我是否可以在父类中创建这个公共对象,所以我不需要在它的所有子类中创建它?这是我的代码,虽然它有效,但我真的不确定我做对了。

public class Frame1 extends JFrame {
    Settings config = new Settings(); //this is the object I want to reference within subclasses

    class Update extends SwingWorker<Integer, Void> {  //first subclass

        @Override
        protected Integer doInBackground() throws Exception {
            Settings config = new Settings(configFilePath);  //yet I have to create the object within every subclass, this time an argument is required.  
            String templateDir = config.getProperty("templatedir");
            String writePath = config.getProperty("outputdir");
            //do some logic code, not required for my question
        }

        @Override
        protected void done() {
            Update2 update2 = new Update2();
            update2.execute(); //start the next subclass which also needs access to Settings(configFilePath)
        }
    } 
}

public class Settings extends JFrame {
    String configFilePath = "C:/path/to/settings.properties";
    Properties properties = new Properties();
    public Settings(String configFilePath) throws IOException {

        this.configFilePath = configFilePath;
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(configFilePath);
            properties.load(fis);

        } catch (FileNotFoundException e) {
            setDefaults();
        } finally {
            if (fis != null) {
                fis.close();
            }
        }
    }
}

我不确定我这样做是否正确,它似乎可以工作,但每次我需要访问我的用户设置时都必须创建配置对象似乎是相当多余的。我希望以前没有人问过这个问题,如果有,请给我链接,因为我找不到。

4

2 回答 2

2

FromUpdate你可以使用Frame1.this来访问thisof Frame1(因为Update是 的内部类Frame1)。

然后访问config您可以使用Frame1.this.config.

这是一个工作示例:

public class PrefixerFactory {
    private String prefix; // Used by Prefixer

    public PrefixerFactory(String prefix) {
        this.prefix = prefix;
    }

    public Prefixer createPrefixer() {
        return new Prefixer();
    }

    public class Prefixer { // Inner class
        public String addPrefix(String value) {
            // Using "prefix" from PrefixerFactory
            return PrefixerFactory.this.prefix + value;
        }
    }

    public static void main(String[] args) {
        Prefixer helloPrefixer = new PrefixerFactory("Hello ").createPrefixer();
        Prefixer goodbyePrefixer = new PrefixerFactory("Good bye ").createPrefixer();

        System.out.println(helloPrefixer.addPrefix("world")); // Hello world
        System.out.println(goodbyePrefixer.addPrefix("world")); // Good bye world
    }
}
于 2013-07-16T18:24:17.337 回答
2

您可以将 Setting 类创建为Singleton模式,这是一个示例:

public class Settings extends JFrame{
    String configFilePath = "C:/path/to/settings.properties";
    Properties properties = new Properties();

    private static Settings instance;

    public static Settings getInstance(){
       if(instance==null){
           instance = new Setting();
       }
       return instance;
    }

    private Settings() throws IOException {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(configFilePath);
            properties.load(fis);

        } catch (FileNotFoundException e) {
            setDefaults();
        } finally {
            if (fis != null) {
                fis.close();
            }
        }
    }
}

在系统的任何其他类中的用法:

Settings.getInstance().getProperty("...");
于 2013-07-16T18:28:27.463 回答