【发布时间】:2011-07-06 16:31:30
【问题描述】:
我有一个如下所示的课程:
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
}
name 属性可以通过以下方式之一定义:
- 开发者在源码中定义的默认值
- 在数据库中定义的默认应用值(覆盖开发者的默认值),
- 在数据库中定义的位置特定值(覆盖之前的两个值)
在应用程序中,位置对象由Map<Integer,Location> locations = Location.getAllLocations(); 实例化
实现 1. 和 3. 很简单,但是实现 2.“应用程序特定默认值”的最合适方式是什么:
-
我可以在 getNameFromDatabase 方法中获取默认值,但是我正在为每个新位置在数据库中寻找一个默认值(因为它是默认值,所以应该只选择一次)
-
在位置对象实例化中,我可以预先将默认值读取到一个特殊的位置对象中,然后将该对象传递给构造函数(但我相信我会破坏关注点分离)
-
我相信我需要在类中实例化的静态单例,但我不知道如何实现它
编辑
-
显示的 name 属性只是整个类的一个 sn-p(大约有 20 个属性)
-
默认应用值也存储在数据库中;实际上它与其他位置在同一个表中,除了它有一个特殊的 id -1;所以我目前在 getNameFromDatabase 方法中所做的是
select * from location where location_id in (-1, &lt;locationid&gt;) order by location_id,但我确实认为这是一个糟糕的设计,因为我正在读取我设置的每个位置的默认位置值 -
所以我正在寻找的是:在方法 getnamefromdatabase 中,它首先检查是否有为我的位置 ID 定义的名称。如果没有,检查我是否已经有一个 globaly 定义的 defaultlocationname,如果没有,在数据库中找到它然后定义全局 defaultlocationname。
【问题讨论】:
标签: java oop design-patterns separation-of-concerns