gpt4 book ai didi

java - 如何使用oop和soc实现从数据库读取默认对象设置

转载 作者:行者123 更新时间:2023-12-01 05:43:13 25 4
gpt4 key购买 nike

我有一个类,如下所示:

public class Location {
private int id;
private String name = "noname";
... // other properties

public Location(int locationId) {
this.id = locationId;
this.name = getNameFromDatabase(locationId);
}

public static Map<Integer,Location> getAllLocations() {
// reads all locations from database and puts objects into a map
}

... // other methods

}

可以使用以下方式之一定义名称属性:

  1. 开发者在源代码中定义的默认值
  2. 数据库中定义的默认应用程序值(覆盖开发人员的默认值),
  3. 数据库中定义的位置特定值(覆盖之前的两个值)

在应用程序中,位置对象由 Map<Integer,Location> locations = Location.getAllLocations(); 实例化。

实现 1. 和 3. 很简单,但是实现 2.“应用程序特定默认值”的最合适方法是什么:

  • 我可以在 getNameFromDatabase 方法中获取默认值,但随后我会在数据库中为每个新位置寻找默认值(因为它是默认值,所以应该只选择一次)

  • 在位置对象实例化中,我可以预先将默认值读取到特殊的位置对象中,然后将该对象传递给构造函数(但我确实相信我会打破关注点分离)

  • 我相信我需要某种静态单例,它将在类内实例化,但我不知道如何实现它

    编辑

  • 显示的 name 属性只是整个类的一个片段(大约有 20 个属性)

  • 默认应用值也存储在数据库中;事实上,它与其他位置位于同一个表中,只是它有一个特殊的 id -1;所以我目前在 getNameFromDatabase 方法中所做的是 select * from location where location_id in (-1, &lt;locationid&gt;) order by location_id ,但我确实认为这是一个糟糕的设计,因为我正在读取我设置的每个位置的默认位置值

  • 所以我正在寻找的是:在 getnamefromdatabase 方法中,它首先检查是否为我的位置 id 定义了名称。如果没有,请检查我是否已经定义了全局默认位置名称,如果没有,请在数据库中找到它,然后定义全局默认位置名称。

最佳答案

如果您正确定义了 getNameFromDatabasegetApplicationDefaultName 方法,则应该执行类似以下操作的操作。 (还应该定义 setApplicationDefaultName 方法来设置给定 locationId 的应用程序名称)

private int id;
private String name =- "noname"; // default in source code?

public Location(int locationId) {
// ...
String appName = Location.getApplicationDefaultName();
String dbName = getNameFromDatabase(locationId);
if(dbName != null) {
this.name = dbName;
} else if (appName != null) {
this.name = appName;
} // else name will default to initially set value.
}

当您使用语句 this.name = getNameFromDatabase(locationId) 分配名称时,您将覆盖之前分配给 this.name 的值,因此您的情况 1 将不被实现。您分配名称(或具有第 1,2 点和第 3 点所描述的预期行为的任何属性)的逻辑应该是:

if (db has specific name)
use db specific name // point 3
else if (db has default name) // point 2
use db default name
else
don't overwrite source code name //point 1

编辑

将检索默认数据库值与检索该值的实践(每个虚拟机一次,或每次,或有时取决于月相)分开的一种方法是使用 Strategy 设计图案。接口(interface) RetrievalMethod 应该有一个方法 getDefaultFromDatabase(),其行为可由实现者指定。执行此操作后,您的位置的 getApplicationDefaultName 方法(以及 RetrievalMethod 策略设置方法)将如下所示:

private RetrievalMethod myLocationRetriever = GenericRetrievalMethod(/*...*/);
// ...
public void setLocationRetrievalMethod(RetrievalMethod retr) {
myLocationRetriever = retr;
}
// ...
private String getApplicationDefaultName() {
myLocationRetriever.getDefaultFromDatabase();
}

根据您的应用程序规范,您可以将 myLocationRetriever 设置为适当的行为。

关于java - 如何使用oop和soc实现从数据库读取默认对象设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6599878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com