这可能是一个奇怪的问题。
我正在设计一些代码......暂时看起来像这样:
abstract class MyAbstractObject {
String param ;
abstract void execute () ;
}
class MyObject1 extends MyAbstractObject {
String otherParam ;
void exectute() { // implementation } ;
}
class MyObject2 extends MyAbstractObject {
void exectute() { // other implementation } ;
}
class useMyObject {
void thisFunctionUsesMyObjects () {
MyObject1 obj1 = new MyOject1(param1, param2) ;
MyObject2 obj2 = new MyObject2(param1) ;
obj1.execute() ;
obj2.execute() ;
}
void thisFunctionToo () {
MyObject1 obj1 = new MyOject1(param3, param2) ;
MyObject2 obj2 = new MyObject2(param3) ;
// and we could have some more different MyObjectX as well...
MyObject3 obj3 = new MyObject3(param3) ;
MyObject4 obj4 = new MyObject4(param3) ;
// with an execution in another order
obj1.execute() ;
obj3.execute() ;
obj2.execute() ;
obj4.execute() ;
}
}
我想知道是否有更好的方法来执行此类代码...考虑到我可以同时运行多个函数,例如 thisFunctionUsesMyObjects() (因此静态不能成为解决方案)。
我不知道为什么它让我烦恼......我认为事实上两个 MyObject(1,2) 总是具有相同的第一个参数,并且两者都只公开并调用了它们的execute()方法。
也许没有更好的办法了。
最佳答案
大概,您必须创建 MyObject
和 MyObject2
的新实例,因为 execute
方法不可重入并且实例不可重用。 (考虑到您通过构造函数参数为执行方法提供输入的方式,我看不出它有什么不同。)
您可以通过一些重写来改进代码:
MyObject1 obj1 = new MyOject1(param3, param2) ;
MyObject2 obj2 = new MyObject2(param3) ;
obj1.execute() ;
obj2.execute() ;
可以写成:
new MyOject1(param3, param2).execute();
new MyObject2(param3).execute();
然后你可以重构:
void thisFunctionUsesMyObjects () {
MyObject1 obj1 = new MyOject1(param1, param2) ;
MyObject2 obj2 = new MyObject2(param1) ;
obj1.execute() ;
obj2.execute() ;
}
void thisFunctionToo () {
MyObject1 obj1 = new MyOject1(param3, param2) ;
MyObject2 obj2 = new MyObject2(param3) ;
obj1.execute() ;
obj2.execute() ;
}
变成:
void thisFunctionUsesMyObjects () {
doIt(param1, param2);
}
void thisFunctionToo () {
doIt(param3, param2);
}
private void doIt(p1, p2) {
new MyOject1(p1, p2).execute();
new MyObject2(p1).execute();
}
显然,这种模式的实例越多,好处就越多。 OTOH,如果模式不像您的示例所示一致,则重构可能会更复杂。
关于java - 避免大量实例化 "MyObjectX extends AbstractObject"来调用每个 myObjectX.execute() ?设计模式 ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17022454/