2012-06-06 51 views
1

假设控制,我需要如下创建一个对象,并设置一些值当对象被创建

FileMetaData fileMeta = fileContainer.getMetaData(); 

    fileMeta.setFileName("file name"); 
    fileMeta.setServer("my box"); 
    fileMeta.setDirectory("/path/to/dir"); 
    fileMeta.setFileType(FileType.PROPERTIES); 

后,我打算用这个对象引用做一些有用的东西。

我想承认的事实,这是可能的系统的用户无法设置某些字段,例如,人们可以忘记

fileMeta.setDateModified(12345); 

是它在某种程度上能够保证所有(或某些特定的)字段在使对象可用之前设置?

+0

通过“使对象可用”,你的意思是什么? – NPE

+0

对象是单身吗?如果是这样 - 单身模式的变体可以产生一个优雅的解决方案。 – amit

回答

2

中没有任何语言来执行本(除具有孤可见构造函数所需的所有参数),但你可以做到这一点惯用,对建造者模式的变化和一些方法链接:

FileMetaData fileMeta = new FileMetaDataBuilder(fileContainer.getMetaData()) 
    .setFileName("file name") 
    .setServer("my box") 
    .setDirectory("/path/to/dir") 
    .setFileType(FileType.PROPERTIES) 
    .build(); 

build()方法可以确保在调用具有所有必需参数的FileMetaData的相应构造函数之前设置所有必填字段。

1

使用构建器模式并将引用传递给构建器。当你完成在顶部添加附加功能时,调用.build并捕获返回的FileMetaData实例。

您可以通过在设置所有先决条件之前不允许构建成功来限制它。

+0

[Builder pattern description](http://www.oodesign.com/builder-pattern.html) –

+0

我喜欢这个。谢谢! – JAM

0

基本上我可以分类以下3种方法。

首先是基于类本身。您可以将方法isReady()添加到您的班级。此方法将执行所有检查并返回true或false。

其他方法是使用Factory或Builder模式并可能使用对象存储库。工厂和生成器都保证能够在就绪状态下创建对象。存储库可以用来在那里“发布”现成的对象,所以其他代码只需要请求对象并以准备状态接收它们。

其他方法是使用Wrapper(装饰器)模式。

interface Foo { 
    public void foo(); //business method 
} 

class FooImpl implements Foo { 
    public void foo(){} // does the work 
} 


class FooDecorator implmeents Foo { 
    Foo foo; 
    public void foo(){ 
     if (isInitialized()) { 
      foo.foo(); 
     } 
     throw IllegalStateException("Not initialized"); 
    } 
} 

该解决方案可以使用动态代理或使用AOP框架来实现。