当前位置: 首页 > 知识库问答 >
问题:

检查对象是否正确内置Java

曾成天
2023-03-14

这是我遇到的一个普遍问题。我想知道是否有人知道任何合适的设计模式或技术。

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中缺少数据。

我的问题是,检测对象是否已正确构建的最佳方法是什么?

  • 我可以检查set方法中的空值或空值并抛出异常。这种方法的问题是抛出异常很昂贵,并且会阻塞日志文件,因为会有许多无法构建对象的实例;

我还可以使用哪些其他方法?

共有3个答案

荀增
2023-03-14

这种验证的另一种方法是使用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因为对象已正确构建。

    这将允许您通过反射来选择要在结构中的字段,而无需引入从基类继承的字段。

  • 叶晋
    2023-03-14

    我不会在不异常的情况下抛出异常。由于构造函数不生成对象的唯一方法是抛出,因此您不应该延迟对构造函数的验证。

    如果结果无效,我仍然建议构造函数抛出,但在这之前应该进行验证,因此您甚至不会使用无效的外部对象调用构造函数。

    如果您想将其实现为静态方法boolean MyBuilderClass.validate(ExternalObject)或在此验证中使用构建器模式,则由您决定。

    别子实
    2023-03-14

    如果我错了,请纠正我:您正在尝试找到一种好方法来检查对象是否有效,如果无效,请在不使用异常的情况下告诉客户端代码。

    您可以尝试工厂方法:

    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中不起作