当前位置: 首页 > 面试题库 >

Java构造函数样式:检查参数不为null

益思博
2023-03-14
问题内容

如果您有一个可以接受某些参数但不允许使用任何参数的类,则最佳做法是null什么?

以下内容显而易见,但有一点例外:

public class SomeClass
{
     public SomeClass(Object one, Object two)
     {
        if (one == null || two == null)
        {
            throw new IllegalArgumentException("Parameters can't be null");
        }
        //...
     }
}

在这里,异常使您知道哪个参数为空,但是构造函数现在很丑陋:

public class SomeClass
{
     public SomeClass(Object one, Object two)
     {
        if (one == null)
        {
            throw new IllegalArgumentException("one can't be null");
        }           
        if (two == null)
        {
            throw new IllegalArgumentException("two can't be null");
        }
        //...
  }

这里的构造函数比较整洁,但是现在构造函数代码实际上不在构造函数中:

public class SomeClass
{
     public SomeClass(Object one, Object two)
     {
        setOne(one);
        setTwo(two);
     }


     public void setOne(Object one)
     {
        if (one == null)
        {
            throw new IllegalArgumentException("one can't be null");
        }           
        //...
     }

     public void setTwo(Object two)
     {
        if (two == null)
        {
            throw new IllegalArgumentException("two can't be null");
        }
        //...
     }
  }

以下哪种风格最好?

还是有一个更广泛接受的替代方案?


问题答案:

第二或第三。

因为它告诉您API的用户到底出了什么问题。

对于较低的冗长程度,请使用Validate.notNull(obj, message)commons-lang。因此,您的构造函数将如下所示:

public SomeClass(Object one, Object two) {
    Validate.notNull(one, "one can't be null");
    Validate.notNull(two, "two can't be null");
    ...
}

带有相同详细程度注释的将支票放入设置器中也是可以接受的。如果设置者还具有保持对象一致性的作用,则也可以选择第三个。



 类似资料:
  • 我正在使用一个较旧版本的自动化脚本,该脚本登录到一个页面并运行测试。 我们希望将经典的selenium构造函数更改为WebDriverBackedSelenium构造函数,以便进行更多相关的测试。 我们最初的构造函数调用是: 如何使用相同的参数设置WebDriverBackedElenium构造函数?API显示我们需要将构造函数设置为: 似乎没有任何关于selenium服务器运行的位置、端口和浏览

  • 问题内容: 必须使用无参数构造函数(像Hibernate这样的工具会在此构造函数上使用反射来实例化对象)。 我得到了这个手挥手的答案,但是有人可以进一步解释吗?谢谢 问题答案: hibernate,并且通常通过反射创建对象的代码用于创建类的新实例。此方法需要一个公共的无参数构造函数才能实例化该对象。对于大多数用例,提供无参数构造函数不是问题。 有一些基于序列化的技巧可以解决没有no-arg构造函数

  • 实际上,我不明白无参数构造函数和默认构造函数的区别是什么。 在创建名为cFrame的Test对象时,是否调用此类的默认构造函数?

  • 当Java中给出参数构造函数时,为什么默认的无参数构造函数会失败? 这个设计有什么意义? 例如:

  • 本文向大家介绍Java构造函数,包括了Java构造函数的使用技巧和注意事项,需要的朋友参考一下 构造函数与方法相似,但在以下方面有所不同。 它们没有任何返回类型。 构造函数的名称与类的名称相同。 每个类都有一个构造函数。如果我们未为类明确编写构造函数,则Java编译器将为该类建立默认构造函数。 每次创建一个新对象时,将至少调用一个构造函数。 一个类可以具有多个构造函数。 示例 输出结果

  • 我正在浏览hibernate留档,文档说hibernate需要为我们所有的持久类提供一个no-arg构造函数: 无参数构造函数是所有持久类的要求;Hibernate必须使用Java反射为您创建对象。构造器可以是私有的,但是在没有字节码插装的情况下,运行时代理生成和有效的数据检索需要包或公共可见性。 但是当我通过创建一个没有任何无参数构造函数的POJO类并放置一个接受参数的构造函数来创建一个示例程序