一般问题
我有一些对象有一些在创建时不知道的变量。
现在,我创建这些对象,并逐渐填充它们,直到它们被完全实例化。但是我想知道,“逐渐填充一个对象直到它被完全实例化是一个好的设计吗?”
我的具体问题
我正在开发一个具有任务对象层次结构的Java程序。这些任务有一些在我创建这些任务时已知的变量,还有一些只有在任务被调度时才知道的变量。现在,我用已知的变量创建这些任务,当任务准备好调度时,我调用scheduleTask( tasks ),这个方法将设置当任务被调度时已知的变量。
但是,创建未完全实例化的对象,并在其已知时设置其余变量,这是一个很好的解决方案吗?
我正在考虑推迟任务的创建,直到所有变量都知道(当它正在被调度时)。但是,只有在获得外部资源的批准后,才能安排一些技术进步。
有人对如何解决这个问题有一些设计思想吗?
编辑:我忘了提到我有不同类型的任务,它们都是从“任务”继承的。
编辑2:"ProposedTask“对象如何,这些对象的变量在调度前就已经知道?对这些文件的引用可以保留到获得批准为止。然后可以创建一个新的“任务”,同时根据" ProposedTask“对象进行调度('scheduleTask(ProposedTask p)‘现在需要一个ProposedTask对象)。
发布于 2011-12-03 23:46:32
使用Builder模式。例如:
Task.Builder b = new Task.Builder():
b.knownProperty(value).anotherProperty(value2);
myExecutor.schedule(b);
...
void schedule(Task.Builder b) {
b.propertyBeforeExecute(value);
Task t = b.build();
}许多框架使用它创建部分创建的对象,然后执行一些操作。例如: Http请求生成器-> HttpPool执行器
发布于 2011-12-03 23:49:02
如果这对你有意义的话你就能做到..。
若要初始化对象中的变量并在以后填充它们,可以将它们设置为null。
public class MyClass {
public int firstvar=null;
public String secondvar=null;
public String useVars() {
if(firstvar!=null && secondvar!=null)return firstvar+" "+secondvar;
else return null;
}
}
public class Main {
MyClass m;
String result;
public void runIt(){
m=new MyClass();
m.firstvar=5;
result=m.useVars();
}
public void doLater(){
m.secontvar="hello";
result=m.useVars();
}
}更令人费解的是,您可以使用自定义的例外.
public String useVars throws MyCustomException(){ /* .... */
if(firstvar==null || secondvar==null)throw new MyCustomException("ERROR!!!!!!!");
}
public class MyCustomException extends Exception {
public CustomException(String s){ super(s);}
}发布于 2011-12-04 00:53:29
如果您的类很复杂,为了简化状态检查和划分无效状态,请考虑将所有TBD字段放入一个单独的类(可能只是一个内部类)。然后将其设置为null,或者让它实现一个readyToGo()方法,这将更容易地检查它们是否已被填充。任务对象将具有稳定、有效的状态。例如(跳过许多getter和setter,它们可能根本不需要,请使用包访问)
public class Task {
final int known1; // the final is optional but I usually use it
final String known2;
final TBD tbd = new TBD(); // might be transient depending on your persistance???
public Task(int known1, String known2) {
this.known1 = known1;
this.known2 = known2;
}
public void submit() {
if (!tbd.readyToRun())
throw new IllegalStateException();
// do real work here...
}
public void setTBDSomething(int something) { tbd.something = something; }
public void setTBDStartDate(Date startWhen) { tbd.startWhen = startWhen; }
class TBD {
int something;
Date startWhen;
boolean readyToRun() { // Dixie Chicks music optional...
return something > 0 && startWhen != null;
}
}
}https://stackoverflow.com/questions/8371929
复制相似问题