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



在我的 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
}

类数据导出者

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 种方法,因为如果我不需要,我不想查询数据库两次。

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

您可以拥有PersonDataExporterPerson扩展类似 AbstractPerson . 但是,由于您尚未这样做,因此进行继承可能不合适。

我认为是有效的C++谈到了遏制如何比继承更好。 IIRC的原因是,遏制比继承更松散。

在这里,您将拥有一个同时包含PersonDataExporterPerson的对象。 您的方法将填充此联合类型对象之一,通过查看哪个为 null,您将知道您实际拥有哪个。

public class DBPersonUnion {
  private Person person = null;
  private DataExporterPerson dataExporterPerson = null;
  //getters and setters.
}

如果你的方法需要返回两种不同的类型,这是一个提示,表明你的架构或方法逻辑有问题。

你能做什么?

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

最后一点的例子

 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);
  }

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

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

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

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

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

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

最新更新