为提高Java Beans铺路
Java类的选择是真的只用一个typesafe解决方案,而其通过改进风格,这些类可以更好的代替structs,而且有他们自己的一些优势。
举个带有两个arguments的一个返回类——一个name和一个 date of birth:
public class PersonNameDOB { private String name; private Date dob; public Date getDob() { return dob; } public void setDob(Date dob) { this.dob = dob; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
显然这是一个编造的例子,有机会你可以有一个已经定义的可返回的Person 类。用一个方法返回两个不同的对象,但是不要有已经为他们定义的一个类,或者也许你最终返回到一个类,这个类带有更多的信息为了只从中得到一对条目。根据不同的可能更糟糕的情况。例如,如果有人调用你的方法开始在返回的对象中使用或是修改值时你会打算让这样的事情发生?
以上是代码而不是所必须的。这意味着要变成返回一些值的一个轻便的方法,所以我们来做些改变:
public class PersonNameDOB { public final String name; public final Date dob; public PersonNameDOB(String name, Date dob) { this.name = name; this.dob = dob; } }
结果很短,但更适合这个任务。值被返回,setters也没有必要了,我们只要在返回对象被创建时建立值就行了。它们不需要改变,因为它们在一个constructor中,他们最后会被制造出来的。现在他们是最终的结果,类公开也没有任何风险,因为他们没有受到影响,所以现在你可以摆脱getters和setter了。结果很短而且便于使用:
PersonNameDOB personNameDOB = SSNLookup.lookupBySSN("123-45-6789"); System.out.println(personNameDOB.name); System.out.println(personNameDOB.dob); And the lookupBySSN method: lookupBySSN方法: public PersonNameDOB lookupBySSN(String ssn) { ... Find the person record in the DB, etc. ... return new PersonNameDOB(person.getName(), person.getDOB()); }
如果这个显然看起来非常棒,只要忍受我把事情进一步发展。
我喜欢这个方法来减轻返回对象。它是typesafe,所以没有必要在返回后分配数组外的对象。更好的是,最后修改的属性意味着这些返回的对象不能滥用——它们只是用于数据的转移。
将这个安全的步骤进一步,我建议你可以复制对象或是有可能使用不改变的对象,因为不这样做通过调用方法会增加在你的donor对象的值的意想不到的修改。在我们的例子中,String是不可改变的,但是数据是复制的:
public PersonNameDOB lookupBySSN(String ssn) { ... Find the person record in the DB, etc. ... return new PersonNameDOB(person.getName(), new Date(person.getDOB().getTime())); } 这个将阻止一个caller,操作如下: PersonNameDOB personNameDOB = SSNLookup.lookupBySSN("123-45-6789"); personNameDOB.dob.setTime(0);
从一方影响原始DOB值,这是个很大的风险。如果你不能使用这些不改变的值,要务必在你的结果中复制并返回那些副本。
以上的模式是一个使用过多次的作为一个struct代替Java API调用,但是对创建这些类它仍然是一个损耗,如果你想要做的是返回两个类型对象,这确实是很平常的(许多finder算法可以更有效率的工作,通过简单的返回相关的一对代替一个,如一个密码,是添加到地图中的有价值的pair)。
这种情况下这似乎像是一个低挂的水果,但是从Java SE标准分配中神秘失踪的是一个genericized Pair class。看一看你如何能够从上面的模式中构建它。
首先,值要比name和dob要普遍。最普遍的似乎是把fields命名为first和 second:
public class Pair { public final String first; public final Date second; public Pair(String first, Date second) { this.first = first; this.second = second; } }
到目前为止一起都很顺利。你现在有一个大致的类来返回Strings 和Dates,但不是其他的类型。如下:
public class Pair { public final A first; public final B second; public Pair(A first, B second) { this.first = first; this.second = second; } }
不必去担心通配符这些东西只是代码一但返回类型的一个快捷方式。这个类现在可
相关新闻>>
- 发表评论
-
- 最新评论 更多>>