我似乎发现有关OOP的所有文档都太基础或太高级。我正在尝试解决一个特定的问题,如果不使用Singletons或全局实例,我就无法得到一个好的解决方案。
我正在尝试创建一个基于数据库的应用程序:我有一个带有Box的数据库存储在某个位置。所以我创建了表:框和位置
BOXES
| id | Name | Location |
------------------------
| 1 | AA | 1 |
| 2 | AB | 2 |
LOCATIONS
| id | Name |
---------------------
| 1 | Garage |
| 2 | Living Room |
当试图将它带到Java应用程序时,我希望有一个Box类,我可以为DB中的每个框和位置实例化它们并将它们放在列表中。 我的问题是:我如何设计Box和位置类?
直接方法是:
class Box {
int id;
String name;
Location location;
}
Class Location {
int id;
String name;
}
但是,我怎样才能正确操作地点?我仍然希望从我的应用程序中管理它们,并且有一个工具可以返回给定id的Location对象。 类似的东西:
Location loc = new Locations.getById(1);
它会查询返回适当的填充对象的内容(如n enum)。
有人能指出可以解释这种服务和解决方案的资源吗?
答案 0 :(得分:1)
这取决于您与持久层的交互方式等。
正如其中一条评论暗示的那样,一种可能性是在Location类上有一个List,这样您就可以轻松地“查询”特定位置的哪些框。
关于问题的实例化部分,也许你可以看看: http://en.wikipedia.org/wiki/Builder_pattern和http://en.wikipedia.org/wiki/Factory_method_pattern
我想你不想打个电话:
new Location().getById(1);
但更像是:
Location.getById(1);
这个工厂方法可以从数据库数据中实例化一个新的Location并返回它。它不需要保持状态,所以你不会在Singleton Hell中结束。
希望它有所帮助。
P.S。:如果您没有手动编写与数据层的交互,这意味着,通过直接使用JDBC,您选择的ORM(对象关系映射)可能会为您解决此问题。
答案 1 :(得分:1)
你可以使用Map
来"映射"对象的ID:
public static void main( String[] args )
{
Map< Integer, Box > boxes = new HashMap< Integer, Box >();
boxes.put( 1, new Box( "AA", 1 ) );
boxes.put( 2, new Box( "AB", 2 ) );
Map< Integer, Location > locations = new HashMap< Integer, Location >();
locations.put( 1, new Location( "Garage" ) );
locations.put( 2, new Location( "Living Room" ) );
// example
String s = locations.get( boxes.get( 2 ).location ).name;
System.out.println(s);
}
class Box
{
String name;
int location;
public Box( String name, int location )
{
this.name = name;
this.location = location;
}
}
class Location
{
String name;
public Location( String name )
{
this.name = name;
}
}
答案 2 :(得分:1)
即使您的问题标题表明OO设计,通过阅读您的问题,我感觉您对在应用程序中处理持久对象的一般方法更感兴趣。
只是要明确......这不是OO设计的答案,即使OO概念将成为您解决方案的一部分。
以下是您实现目标的一些方法:
BoxService.get().getObjectByName(name).location;
这样的对象。最流行的选项似乎是hibernate,但是mybatis是一个很好的选择。使用ORM本身就是我选择的路线,但对我来说,这只是一种偏好。我无法详细说明为什么ORM会比JDO或JPA更好。这应该是足够的信息让你开始。如果您正在寻找真正的自己动手方法,那么请参阅其他答案之一。我的回答是对开发人员常用的概述。