这是我遇到的一个普遍问题。我想知道是否有人知道任何合适的设计模式或技术。
private ExternalObject personObject;
private String name;
private int age;
private String address;
private String postCode;
public MyBuilderClass(ExternalObject obj)
this.personObject=obj;
build();
}
public build() {
setName(personObject.getName());
setAge(personObject.getAge());
setAddress(personObject.getAddress());
setPostCode(personObject.getPostCode());
.
.
. many more setters
}
上面的类从队列中获取外部对象并构造MyBuilderClass对象。
如果所有字段都设置为非null非空值,则成功构建MyBuilderClass对象。
将有许多MyBuilderClass对象无法构建,因为ExternalObject中缺少数据。
我的问题是,检测对象是否已正确构建的最佳方法是什么?
我还可以使用哪些其他方法?
这种验证的另一种方法是使用java注释:
>
做一个简单的注释类,让我们说验证
:
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@interface Validate {
boolean required() default true;
}
然后将您要呈现的字段注释为@验证(必需=true)
:
class MyBuilderClass {
private ExternalObject externalObject;
@Validate(required=true)
private String name;
@Validate(required=false) /*since it's a primitive field*/
private int age;
@Validate(required=true)
private String address;
@Validate(required=true)
private String postCode;
MyBuilderClass(ExternalObject externalObject) {
this.externalObject = externalObject;
build();
}
public void build() {
setName(personObject.getName());
setAge(personObject.getAge());
setAddress(personObject.getAddress());
setPostCode(personObject.getPostCode());
}
//.
//.
//. many more setters
}
然后在MyBuilderClass
类中添加此方法,以检查您的Object是否构建正确:
public boolean isCorrectlyBuilt() throws IllegalAccessException {
boolean retVal = true;
for (Field f : getClass().getDeclaredFields()) {
f.setAccessible(true);
boolean isToBeChecked = f.isAnnotationPresent(Validate.class);
if (isToBeChecked) {
Validate validate = f.getAnnotation(Validate.class);
if (validate.required()/*==true*/) {
if (f.get(this) == null) {
retVal = false;
break;
/* return false; */
}
}
}
}
return retVal;
}
以下是使用示例:
public static void main(String[] args) throws Exception {
ExternalObject personObject = new ExternalObject();
personObject.setAge(20);
personObject.setName("Musta");
personObject.setAddress("Home");
personObject.setPostCode("123445678");
MyBuilderClass myBuilderClass = new MyBuilderClass(personObject);
System.out.println(myBuilderClass.isCorrectlyBuilt());
}
输出:true
因为对象已正确构建。
这将允许您通过反射来选择要在结构中的字段,而无需引入从基类继承的字段。
我不会在不异常的情况下抛出异常。由于构造函数不生成对象的唯一方法是抛出,因此您不应该延迟对构造函数的验证。
如果结果无效,我仍然建议构造函数抛出,但在这之前应该进行验证,因此您甚至不会使用无效的外部对象调用构造函数。
如果您想将其实现为静态方法boolean MyBuilderClass.validate(ExternalObject)
或在此验证中使用构建器模式,则由您决定。
如果我错了,请纠正我:您正在尝试找到一种好方法来检查对象是否有效,如果无效,请在不使用异常的情况下告诉客户端代码。
您可以尝试工厂方法:
private MyBuilderClass(ExternalObject obj)
this.personObject=obj;
build();
}
public static MyBuilderClass initWithExternalObject(ExternalObject obj) {
// check obj's properties...
if (obj.getSomeProperty() == null && ...) {
// invalid external object, so return null
return null;
} else {
// valid
MyBuilderClass builder = new MyBuilderClass(obj);
return builder.build();
}
}
现在,您知道对象是否在不使用异常的情况下有效。您只需要检查initWithExternalObject返回的值是否为null。
问题内容: 有没有一种快速的方法来检查对象是jQuery对象还是本机JavaScript对象? 例: 显然,上面的代码有效,但并不安全。您可能会向对象添加选择器键并获得相同的结果。有没有更好的方法来确保该对象实际上是jQuery对象? 符合 问题答案: 您可以使用运算符: 说明 :该函数(又名)被实现为构造函数。构造函数将以前缀调用。 调用时,内部jQuery将此转换为1。JavaScript继续
问题内容: 我有一堆字符,想删除所有不是’#’‘的字符。“ E”和“ G”。 我试图用这个: 但是遇到了不兼容类型的问题。 问题答案:
null 什么做法更好,更“真实”?我喜欢第一个,但再次,不确定我该如何选择Epsilon。
我正在自动化一些涉及android keytool和jarsigner的东西。该工具获取一个密钥存储库、密钥存储库的密码、别名和别名/密钥的密码,我正在尝试找到一种方法来显式检查为别名/密钥提供的密码是否正确。 有什么想法吗?而且,我需要在没有要签名的jar文件的情况下检查它--在我的上下文中获取该文件是很长的,所以我希望早一点而不是晚一点中止。
问题内容: 如何检查值是否是JavaScript中的Object? 问题答案: 更新 : 这个答案是不完整的,并且会产生误导性的结果 。例如,在JavaScript中也被视为类型,更不用说其他几种极端情况了。请遵循以下建议,然后转到其他 原始答案 : 尝试使用和/或。 编辑:这个答案给出了一个如何检查变量属性的想法,但是它不是一个防弹配方(毕竟根本没有配方!)来检查它是否是一个对象,而不是对象。由
问题内容: 我试图得到: 在我自己的脚本中,我以前只是使用它,因为我从来不需要作为属性: 因此,对于第二个对象,我想出了以下方法作为一种快速解决方案-大部分都能奏效。;) 问题是,这取决于浏览器是否强制执行只读属性,而并非所有人都这样做。 有没有好的替代品? 问题答案: 这可能很有趣: 它是DOM Level2的一部分。 更新2 :这是我在自己的库中实现它的方式:(以前的代码在Chrome中不起作