在我的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种方法,因为如果我不需要,我不想两次查询数据库。
答案 0 :(得分:8)
您可以通过继承或包含来处理此问题。
您可以Person
和DataExporterPerson
扩展AbstractPerson
之类的内容。但是,由于您还没有这样做,因此继承可能是不合适的。
我认为有效的C ++谈到了遏制比继承更好。 IIRC的理由是,遏制比继承更松散耦合。
在这里,您将拥有一个包含Person
和DataExporterPerson
的对象。你的方法会为这个联合类型对象填充其中一个,并且通过查看哪一个为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
(或创建DataExporterPerson
和Person
扩展/实现的新类/接口,并将其用作类型。)< / p>