Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果必须将setter值写入文件,如何确保数据一致性?_Java_Synchronization_Getter_Setter_Preferences - Fatal编程技术网

Java 如果必须将setter值写入文件,如何确保数据一致性?

Java 如果必须将setter值写入文件,如何确保数据一致性?,java,synchronization,getter,setter,preferences,Java,Synchronization,Getter,Setter,Preferences,我正在使用首选项存储应用程序设置。我的java类在程序开始时读取设置,然后数据可以通过其他类的简单getter获得 现在我还想实现setter,因为用户可以在程序中更改某些首选项,因此从另一个java类调用setter是更改首选项的一种简单方法 如果我更改了首选项中的值,如何确保首选项和类中的数据一致?我是否应该将数据存储在setter中的运行时对象和首选项中 最重要的是: 在将数据写入首选项之前,如何确保不调用getter?我需要如何同步它们 下面是一个非常简单的例子来说明问题: privat

我正在使用
首选项
存储应用程序设置。我的java类在程序开始时读取设置,然后数据可以通过其他类的简单getter获得

现在我还想实现setter,因为用户可以在程序中更改某些首选项,因此从另一个java类调用setter是更改首选项的一种简单方法

如果我更改了首选项中的值,如何确保首选项和类中的数据一致?我是否应该将数据存储在setter中的运行时对象和首选项中

最重要的是: 在将数据写入首选项之前,如何确保不调用getter?我需要如何同步它们

下面是一个非常简单的例子来说明问题:

private static final Preferences PREFERENCES = //here are valid preferences
private static final String KEY = //Some path to the attribute

private static PrefManager prefManager = new PrefManager();

private String serverIP;

private PrefManager() {
    this.serverIP = PREFERENCES.get(KEY, "");
}


public static void setServerIP(String serverIP) {
    // How do I synchronize the PREFERENCE object and this setter to prevent getter
    // calls between put and = call here?
    PREFERENCES.put(KEY, serverIP);
    prefManager.serverIP = serverIP;
}

在解决比赛条件方面,您可以创建自己的首选项扩展,并添加
synchronized
以设置和获取。有两种方法可以创建首选项扩展:在内部使用映射并在其中复制所有键值,或者创建外观

关于如何保持应用程序的一致性:答案是MVC的控制器部分

立面示例

我已经从首选项中复制了所有方法,并将它们添加到这里。您可以看到构造函数采用了一个Preferences参数,该参数将作为实现此facade中所有方法的参考(有关如何实现的示例,请参见前两个方法absolutePath()和addNodeChangeListener(…),还请注意方法
put
get
已经同步。所以,如果任何线程正在调用put,那么任何其他调用get的线程都将等待put完成。(您可能还想将synchronized添加到其他方法)

===================

public class MyPrefsFacade extends Preferences {
    private Preferences p;

    public MyPrefsFacade(Preferences prefs) {
      p = prefs;
    }

    public String   absolutePath() { return p.absolutePath(); }
    public void addNodeChangeListener(NodeChangeListener ncl) { p.addNodeChangeListener(ncl); }
    public void addPreferenceChangeListener(PreferenceChangeListener pcl)
    public String[] childrenNames()
    public void clear()
    public void exportNode(OutputStream os)
    public void exportSubtree(OutputStream os)
    public void flush()
    public synchronized String  get(String key, String def)
    public boolean  getBoolean(String key, boolean def)
    public byte[]   getByteArray(String key, byte[] def)
    public double   getDouble(String key, double def)
    public float    getFloat(String key, float def)
    public int  getInt(String key, int def)
    public long getLong(String key, long def)
    public boolean  isUserNode()
    public String[] keys()
    public String   name()
    public Preferences  node(String pathName)
    public boolean  nodeExists(String pathName)
    public Preferences  parent()
    public synchronized void    put(String key, String value)
    public void putBoolean(String key, boolean value)
    public void putByteArray(String key, byte[] value)
    public void putDouble(String key, double value)
    public void putFloat(String key, float value)
    public void putInt(String key, int value)
    public void putLong(String key, long value)
    public void remove(String key)
    public void removeNode()
    public void removeNodeChangeListener(NodeChangeListener ncl)
    public void sync()
    public String   toString()
}

可以但实际上我想把所有的首选项都加载到程序中。我不想每次都阅读每个首选项以获得更高的运行时效率。仅当用户设置了一个新值(new serverIP,new serverPort,…),该值必须在my java类的私有值和首选项中更改。还是我对Preferences类的理解有误?preferences类是否存储写入存储设备或RAM中的值?