Java - 从方法返回多个对象类型的最佳方法

时间:2013-08-09 16:36:05

标签: java inheritance containment

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

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

班级人员

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

  // Getters and setters
}

Class DataExporterPerson

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

  // Getters and setters
}

DAO方法:

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 个答案:

答案 0 :(得分:8)

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

您可以PersonDataExporterPerson扩展AbstractPerson之类的内容。但是,由于您还没有这样做,因此继承可能是不合适的。

我认为有效的C ++谈到了遏制比继承更好。 IIRC的理由是,遏制比继承更松散耦合。

在这里,您将拥有一个包含PersonDataExporterPerson的对象。你的方法会为这个联合类型对象填充其中一个,并且通过查看哪一个为null,你就会知道你实际拥有哪一个。

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

  //getters and setters.
}

答案 1 :(得分: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);
  }

答案 2 :(得分: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

答案 3 :(得分:-2)

你可以做两件事。

第一个方法签名为public List<Object> getPeople()。这将允许您执行instanceof并确定哪个是哪个。

OR

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