在我的 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 种方法,因为如果我不需要,我不想查询数据库两次。
您可以通过继承或包含来处理此问题。
您可以拥有Person
并DataExporterPerson
扩展类似 AbstractPerson
. 但是,由于您尚未这样做,因此进行继承可能不合适。
我认为是有效的C++谈到了遏制如何比继承更好。 IIRC的原因是,遏制比继承更松散。
在这里,您将拥有一个同时包含Person
和DataExporterPerson
的对象。 您的方法将填充此联合类型对象之一,通过查看哪个为 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
(或者创建一个DataExporterPerson
和Person
扩展/实现的新类/接口,并将其用作类型(。