面向对象编程:不仅仅是基本对象

时间:2012-02-10 16:25:16

标签: java oop database-design

我似乎发现有关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)。

有人能指出可以解释这种服务和解决方案的资源吗?

3 个答案:

答案 0 :(得分:1)

这取决于您与持久层的交互方式等。

正如其中一条评论暗示的那样,一种可能性是在Location类上有一个List,这样您就可以轻松地“查询”特定位置的哪些框。

关于问题的实例化部分,也许你可以看看: http://en.wikipedia.org/wiki/Builder_patternhttp://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概念将成为您解决方案的一部分。

以下是您实现目标的一些方法:

  1. (这是一个反例......除了试图真正理解为什么你不应该这样做之外,不推荐这个...)写一些构建SQL字符串并运行它们的上帝对象使用JDBC。呸...
  2. 使用JDOJPA。这些是基本上根本不编写SQL的框架。而是声明表示要存储的数据的对象。然后有可用的类/服务对您的对象执行CRUD (Create, Retrieve, Update, Delete) operations,并提供执行事务的机制。
  3. 使用ORM (Object Relational Mapping) framework,要求您将SQL表映射到Java对象。然后,您可以在本地化的位置编写参数化的SQL查询。例如,这允许您创建像BoxService.get().getObjectByName(name).location;这样的对象。最流行的选项似乎是hibernate,但是mybatis是一个很好的选择。使用ORM本身就是我选择的路线,但对我来说,这只是一种偏好。我无法详细说明为什么ORM会比JDO或JPA更好。
  4. 这应该是足够的信息让你开始。如果您正在寻找真正的自己动手方法,那么请参阅其他答案之一。我的回答是对开发人员常用的概述。