首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >逐渐填充对象(正确的设计?)

逐渐填充对象(正确的设计?)
EN

Stack Overflow用户
提问于 2011-12-03 23:37:19
回答 6查看 1.2K关注 0票数 2

一般问题

我有一些对象有一些在创建时不知道的变量。

现在,我创建这些对象,并逐渐填充它们,直到它们被完全实例化。但是我想知道,“逐渐填充一个对象直到它被完全实例化是一个好的设计吗?”

我的具体问题

我正在开发一个具有任务对象层次结构的Java程序。这些任务有一些在我创建这些任务时已知的变量,还有一些只有在任务被调度时才知道的变量。现在,我用已知的变量创建这些任务,当任务准备好调度时,我调用scheduleTask( tasks ),这个方法将设置当任务被调度时已知的变量。

但是,创建未完全实例化的对象,并在其已知时设置其余变量,这是一个很好的解决方案吗?

我正在考虑推迟任务的创建,直到所有变量都知道(当它正在被调度时)。但是,只有在获得外部资源的批准后,才能安排一些技术进步。

有人对如何解决这个问题有一些设计思想吗?

编辑:我忘了提到我有不同类型的任务,它们都是从“任务”继承的。

编辑2:"ProposedTask“对象如何,这些对象的变量在调度前就已经知道?对这些文件的引用可以保留到获得批准为止。然后可以创建一个新的“任务”,同时根据" ProposedTask“对象进行调度('scheduleTask(ProposedTask p)‘现在需要一个ProposedTask对象)。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-12-03 23:46:32

使用Builder模式。例如:

代码语言:javascript
复制
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执行器

票数 3
EN

Stack Overflow用户

发布于 2011-12-03 23:49:02

如果这对你有意义的话你就能做到..。

若要初始化对象中的变量并在以后填充它们,可以将它们设置为null。

代码语言:javascript
复制
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();
 }
}

更令人费解的是,您可以使用自定义的例外.

代码语言:javascript
复制
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);}
}
票数 1
EN

Stack Overflow用户

发布于 2011-12-04 00:53:29

如果您的类很复杂,为了简化状态检查和划分无效状态,请考虑将所有TBD字段放入一个单独的类(可能只是一个内部类)。然后将其设置为null,或者让它实现一个readyToGo()方法,这将更容易地检查它们是否已被填充。任务对象将具有稳定、有效的状态。例如(跳过许多getter和setter,它们可能根本不需要,请使用包访问)

代码语言:javascript
复制
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;
      }
   }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8371929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档