8

在我的 DAO 中,我有一个构建 2 个不同对象的方法,我想返回这两个对象,但我不确定最好的方法是什么。我已经查看了 using ? extends myObject,创建了另一个包含我想要返回的两个对象的类,并且只使用了List<Object>.

长话短说为什么我需要这些类似的对象是在屏幕上显示 1 和另一个与 primefaces dataexporter 一起使用,据我所知,它不处理对象中的列表。

班级人

public class Person() {
  firstName = null;
  lastName = null;
  List<Programs> programs = new ArrayList<Programs>();

  // Getters and setters
}

类 DataExporterPerson

public class DataExporterPerson() {
  firstName = null;
  lastName = null;
  String program = null;

  // Getters and setters
}

道法:

public List<SOMETHING> getPeople() {
  // query db for people

  // build both objects

  return ?????
}

现在我明白我可以很容易地创建另一个像下面这样的对象,但这似乎是一种低效的做事方式,因为我基本上创建一个对象只是为了从 1 方法返回。

public class PersonTransporter() {
  Person person = null;
  DataExporterPerson = null;
}

处理这种情况的最佳方法是什么?

编辑

我试图在 1 个方法中返回 2 个对象的原因是因为这是一个 DAO 方法,它查询数据库并根据查询中的数据构建 2 个对象。我不想将其分解为 2 种方法,因为如果不需要,我不想查询数据库两次。

4

4 回答 4

8

您可以通过继承或包含来处理此问题。

您可以拥有PersonDataExporterPerson扩展类似AbstractPerson. 但是,既然您还没有这样做,那么进行继承可能是不合适的。

我认为是 Effective C++ 谈到了包含比继承更好。IIRC 陈述的原因是包含比继承更松散耦合。

在这里,您将拥有一个同时包含 Person和的对象DataExporterPerson。您的方法将为这个联合类型对象填充其中一个,通过查看哪个为空,您将知道您实际拥有哪个。

public class DBPersonUnion {
  private Person person = null;
  private DataExporterPerson dataExporterPerson = null;

  //getters and setters.
}
于 2013-08-09T16:41:29.790 回答
5

如果您的方法需要返回两种不同的类型,这表明您的架构或方法逻辑存在问题。

你可以做什么 ?

  • 创建一个逻辑连接元素的类,
  • 引入两个类都将实现的通用接口,
  • 实现两个方法第一个返回对象,第二个使用参数并返回第二个对象。

最后一点的例子

 class Foo {
    String f;
 } 

 class Bar {
   String b;
 }

那么问题如何返回对象 Foo 和 Bar ?

 public Object theProblemMethod() {

      Foo a = new Foo();
          a.foo = "Test";

      Bar b = new Bar();
          b.bar = a.foo;   //The logic where class Foo meet class Bar.

    return ???

 }

有效的实现

   public Foo createFoo(){ 
      Foo a = new Foo();
          a.foo = "Test";
      return a;
   } 

   public Bar createBar(Foo f) {

      Bar b = new Bar();
          b.bar = f.foo; 
      reutrn b;
   }

用法

   public void action()  {

           //theProblemMethod(); //This we can not do

          Foo a = createFoo();
          Bar b = createBar(a);
  }
于 2013-08-09T16:45:24.073 回答
2

您的实际问题是设计问题之一。任何方法都不应该做多于一件事:因此返回两个不同对象的方法可能是糟糕的设计。要真正解决这个问题,你应该把你的方法分成两个独立的方法来处理这两个不同的问题。

但是,让我们假设您不能这样做。根据您的笔记,您在两个对象中的大部分状态似乎都是重复的。您可以通过让它们从类似的来源继承来组合这两者 - 但这只能解决您的一半问题。相反,您可以用另一个装饰一个:

public class DataExporterPerson {
  private Person person;
  private String program = null; //or any other

  //other getters/setters, esp to get the core 'person' object.
  //note that getters/setters for repeated state should just
  //  pass through to the underlying object:
  public String getName() { person.getName(); } //for example
}

如果你绝对必须返回两个对象,你可以这样做,但它很难测试并且违反了“无副作用”原则:

public boolean buildThings(ThingA a, ThingB b) {
  a = <whatever>;
  b = <whatever else>;

  return true;//success!
}

//...
//somewhere else in code
ThingA a = null;
ThingB b = null;
boolean result = buildThings(a, b);
//use a and b here
于 2013-08-09T16:52:39.840 回答
-2

你可以做两件不同的事情。

第一个具有方法签名 be public List<Object> getPeople()。这将允许您做instanceof并找出哪个是哪个。

或者

您可以DataExporterPerson扩展Person(或创建一个新的类/接口,DataExporterPersonPerson扩展/实现并将其用作类型)。

于 2013-08-09T16:41:09.270 回答