java设计-哪个类存储应用程序范围的对象?

java设计-哪个类存储应用程序范围的对象?,java,Java,我有一个Server对象,它是在应用程序运行时获得的,我需要在应用程序运行期间保留它。它只是一个具有id和主机名的模型对象 public Server getCurrentServer() { ServerDao dao = // some way to get it try { return dao.findByHost(InetAddress.getLocalHost().getHostName()); } catch

我有一个
Server
对象,它是在应用程序运行时获得的,我需要在应用程序运行期间保留它。它只是一个具有id和主机名的模型对象

public Server getCurrentServer() {
        ServerDao dao = // some way to get it
        try {
            return dao.findByHost(InetAddress.getLocalHost().getHostName());
        } catch (UnknownHostException e) {
            LOGGER.error("Host not found", e);
        }
        return null;
    }
从良好的软件设计和关注点分离的角度来看,对象将存储在哪里,如何访问

让我提供一些代码

public interface ServerDao{
    Server findByHost(String host);
}
这就是我如何从DAO获得对象的方法。实施是无关紧要的

现在让我们假设我想要一个名为
getCurrentServer
的方法,它可以在整个应用程序中调用,并获取属于运行应用程序的机器的
Server
对象(基于主机名)

把它放在
ServerDao
类中可能是个坏主意。把它放在我的
应用程序
类中可能是个坏主意

我将把这种方法放在哪里?我是否应该创建一个
ServerContext
类,其中包含一个
Server
?标准方法是什么


谢谢。

您有一台CurrentServer。需要认识到的重要一点是,CurrentServer是一个选择,该选择由一个选择更新,并在整个应用程序状态中共享

如果您希望在应用程序运行之间保持这种状态,可能需要一个带有显式存储的CurrentServer DAO。然后,您的每个组件都可以选择CurrentServer并可能对其进行更新

这意味着您需要数据库中只能有一个值的主键。数据类型为布尔值的主键列
current
,其中其他人选择的值为
True
应该起作用

现在您可以有多个数据实例,但这些实例可能会过时。这比单例方法最终导致的争用更容易解释(并且更具可扩展性)

public CurrentServer getCurrentServer() {
    CurrentServerDao dao = new CurrentServerDaoImpl(new DefaultDatabaseService());
    try {
        return dao.findByCurrent(Boolean.TRUE);
    } catch (UnknownHostException e) {
        LOGGER.error("Host not found", e);
    }
    return null;
}

您有一个CurrentServer。需要认识到的重要一点是,CurrentServer是一个选择,该选择由一个选择更新,并在整个应用程序状态中共享

如果您希望在应用程序运行之间保持这种状态,可能需要一个带有显式存储的CurrentServer DAO。然后,您的每个组件都可以选择CurrentServer并可能对其进行更新

这意味着您需要数据库中只能有一个值的主键。数据类型为布尔值的主键列
current
,其中其他人选择的值为
True
应该起作用

现在您可以有多个数据实例,但这些实例可能会过时。这比单例方法最终导致的争用更容易解释(并且更具可扩展性)

public CurrentServer getCurrentServer() {
    CurrentServerDao dao = new CurrentServerDaoImpl(new DefaultDatabaseService());
    try {
        return dao.findByCurrent(Boolean.TRUE);
    } catch (UnknownHostException e) {
        LOGGER.error("Host not found", e);
    }
    return null;
}

服务器有复杂多变的状态,为什么说不可变?在OO术语中,“最终对象”是不可变的……服务器有时被描述为“服务”“我认为,对于我的问题来说,它是不变的还是不可变的,这没有什么区别。我去掉了不相关的部分。这个问题更多地涉及到应用程序设计原则单一方法似乎是最好的选择。@ssc327单一方法从来不是最好的选择。使用DI的主要原因就是要解决这类问题。您有需要在不同位置共享和访问的对象,DI框架负责为您实现这一点。服务器具有复杂且不断变化的状态,为什么您说不可变?在OO术语中,“最终对象”是不可变的……服务器有时被描述为“服务”“我认为,对于我的问题来说,它是不变的还是不可变的,这没有什么区别。我去掉了不相关的部分。这个问题更多地涉及到应用程序设计原则单一方法似乎是最好的选择。@ssc327单一方法从来不是最好的选择。使用DI的主要原因就是要解决这类问题。您有需要在不同地方共享和访问的对象,DI框架负责为您实现这一点。我有一个
server
表,其中包含执行应用程序的每台机器的条目。
服务器
表具有id和主机名。我只是希望应用程序根据hostnameOk获取属于它的
Server
实例,因此它不是从所有其他服务器中选择服务器的选定服务器。只需使用DAO的读取功能从数据库中“读取自己”,但获取主机名的功能取决于DAO的实现。如果我有多个DAO,那么我有相同代码的多个副本。看来这不是一个好办法。让我澄清一下。我有一个
server
表,其中包含执行应用程序的每台机器的条目。
服务器
表具有id和主机名。我只是希望应用程序根据hostnameOk获取属于它的
Server
实例,因此它不是从所有其他服务器中选择服务器的选定服务器。只需使用DAO的读取功能从数据库中“读取自己”,但获取主机名的功能取决于DAO的实现。如果我有多个DAO,那么我有相同代码的多个副本。看来这不是一个好办法。