更新对象时更新对象的所有引用(引用引用)

时间:2012-01-16 15:45:05

标签: java object pointers reference

我想在java中声明一个对象,它就像一个指向C ++中指针的指针,让我给大家展示一个例子:

//*** At the application startup

//Initialize a settings container class
Settings settings = //Load settings 

//Declaring static Application class that contain a reference to the settings container
Application.setSettings(settings);

//Get sub settings from settings container class
DatabaseSettings dbSettings =  settings.getDbSettings();
LogSettings logSettings = settings.getLogSettings();

//Initialize components 
DatabaseConnector dbConn = new DatabaseConnector(dbSettings);
Logger logger = new Logger(logSettings);

在上面的代码中我创建了一个包含我的应用程序组件的所有设置的设置容器类,然后我已经将每个子设置类分配给相关组件,此时在程序执行期间我要更新设置并让应用程序的组件查看更新的设置,例如在执行期间,我可以这样更新设置容器:

//Update settings through Application static class 
Settings newSettings = //assign updated settings
Application.setSettings(newSettings);

现在的问题是,当我在运行时更新设置容器时,应用程序静态类将包含对newSettings实例的更新引用,而每个子设置实例都会引用旧的子设置,因此:

dbConn      ---> settings.getDbSettings()
logSettings ---> settings.getLogSettings()

虽然我希望这两个引用自动引用设置的新实例,所以:

dbConn      ---> newSettings.getDbSettings()
logSettings ---> newSettings.getLogSettings()

它就像一个指向指针......在Java中是否可能?怎么做到呢 ?

3 个答案:

答案 0 :(得分:2)

好吧,不是在Application中设置新设置,而是更新现有设置。

或者只是记录这些设置可能会发生变化的事实,并且任何对新设置感兴趣的代码都必须经过Application.getSettings()

答案 1 :(得分:2)

在Java中,您只能引用对象。要引用引用,您需要某种间接引用。 e.g。

AtomicReference<DatabaseSettings> refDatabaseSettings = new AtomicReference<DatabaseSettings>();

refDatabaseSettings.set(dbSettings);

DatabaseSettings dbSettings = refDatabaseSettings.get();

您可以传递参考并在一个地方进行更改。但是,这不会通知任何已更改的引用,只允许所有引用在下次检查时看到相同的内容。

答案 2 :(得分:0)

您需要使用某种形式的通知系统来完成您要执行的操作。一个观察者/可观察或一些基于事件的系统,其中有对这些变化感兴趣的听众,这是唯一可行的方法。

您当然可以创建可以更新的线程安全设置对象(如DatabaseSettings),因此该对象的使用者将获得新值,但这仅适用于最简单的情况。这种方法的问题是多次调用设置实例的结果将变得不一致。假设设置对象中有多个设置彼此相关,如果检索到一个设置,则更新对象,然后检索下一个设置,您无法知道这两个调用是否产生了不一致(彼此的价值观。

例如:

dbSettings.getConnectionUrl();
dbSettings.getUsername();

如果在这两次调用之间更新dbSettings,则用户名和连接将不再匹配。

另一个问题是,如果任何人从设置对象中提取特定值并将它们存储在另一个变量或类中,他们将无法知道它已更改。

它使得这些类的使用方式非常严格且容易出错。