Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 默认构造函数是好的还是坏的?Checkstyle和PMD在这里是相反的_Java_Checkstyle_Pmd_Default Constructor - Fatal编程技术网

Java 默认构造函数是好的还是坏的?Checkstyle和PMD在这里是相反的

Java 默认构造函数是好的还是坏的?Checkstyle和PMD在这里是相反的,java,checkstyle,pmd,default-constructor,Java,Checkstyle,Pmd,Default Constructor,说: 说: 谁是对的?或者让我们这样说——类中有一个空的默认ctor的利弊是什么?我喜欢PMD的答案。代码越少越好。不要编写编译器将为您编写的构造函数 我的印象是,编写构造函数的主要理由是,一些不了解构造函数在Java中如何工作的糟糕程序员可能会在代码中绊倒并感到困惑。我不喜欢写不必要的晦涩代码,但我也不喜欢写简单的代码 但这是我的强迫症,可能是不合理的。世界上有许多应用程序程序员,他们的中心关注点是业务,而不是语言,他们也不是语言专家。很多人使用的一种生存技巧是保持一致的风格,这是否绝对必要不

说:

说:


谁是对的?或者让我们这样说——类中有一个空的默认ctor的利弊是什么?

我喜欢PMD的答案。代码越少越好。不要编写编译器将为您编写的构造函数

我的印象是,编写构造函数的主要理由是,一些不了解构造函数在Java中如何工作的糟糕程序员可能会在代码中绊倒并感到困惑。我不喜欢写不必要的晦涩代码,但我也不喜欢写简单的代码


但这是我的强迫症,可能是不合理的。世界上有许多应用程序程序员,他们的中心关注点是业务,而不是语言,他们也不是语言专家。很多人使用的一种生存技巧是保持一致的风格,这是否绝对必要不是重点。

虽然我有点像较小的代码,但使用默认构造函数可以在需要调试时更容易地设置断点


无论如何,请允许我提醒您,PMD的网站也说这个问题有争议:)

我会选择Checkstyle。由于没有显式(noarg)构造函数,没有人会知道它是否是有意的

考虑这个实用程序类:

public class Util {
    // no constructor given - implicit default constructor
    // intended? probably not, but who knows

    public static void foo() {
      // blabla
    }

    public static void bar() {
      // more blabla
    }

}

当默认构造函数是唯一的构造函数时,用空体显式地编写它或省略它是100%等价的。但是,如果您有任何显式定义的构造函数,无论是否为默认构造函数,编译器都不会生成默认构造函数。这意味着,如果依赖编译器为您生成构造函数,然后添加替代构造函数,那么默认构造函数就会消失。就我个人而言,我倾向于让编译器进行生成;如果默认构造函数正在使用,它将生成编译警告,并且很容易在此时添加。否则,为什么要保留它呢?

默认情况下,编译器会为您生成默认构造函数,因此如果您不想指定任何特殊操作(初始化成员不是这里的重点),则不必指定构造函数

另一件事是一些类应该有一个一致的状态。例如,你有一个图书班。没有必要创建一本没有标题的书,因此有必要使用字符串参数指定构造函数:

public Book(String name) {
    this.name = name;
}
对于默认构造函数,如果您应该序列化类或在编组/解编组中使用它(JAXB需要一个空的默认构造函数),那么它们可能是必需的

如果这不是重点,并且您的类没有所谓的一致性状态,那么完全不需要声明空的默认构造函数

您应该记住默认构造函数默认为公共的,所以如果您想对此进行一些限制,请考虑删除显式的构造函数。


此外,如果你的类相当长,你可以考虑声明一个空的默认构造函数来增加可读性。

和很多有争议的决定一样,事实是,这并不重要。要么写构造函数,要么不写。对代码质量和可维护性的影响可以忽略不计。如果您与其他人一起编码,则采用相同的样式以保持一致性,否则-根据您的喜好执行。

IMO
类应定义一个构造函数
,因为如果您依赖默认构造函数,实例变量将具有默认值(如整数为零,字符串为null等)。如果您希望在为该类创建对象时将实例变量设置为某个默认值,那么在这种情况下,您可以自己定义构造函数。(前提是您不想使用getter和setter方法)

现在,当您创建Cube1类的对象时,该对象的所有实例变量都将设置为10。如果在这里不使用构造函数,那么实例变量(长度、宽度和高度)将具有默认值(在本例中为零)


编辑:[又添加了一件事]

如果您依赖编译器为您生成默认构造函数,并且希望使用一些从用户获取参数的构造函数,则必须定义默认构造函数,否则编译器将生成错误


记住:仅当类不包含任何其他构造函数时,编译器才会为该类生成默认构造函数

我要补充的一点是,如果没有指定构造函数,那么代码可能依赖于一个隐式默认构造函数

然后,当您添加一个特定的构造函数时,代码可能不再编译,甚至更糟的是,代码将不会运行(可能是对无参数构造函数的反射依赖-大多数ORM工具都要求持久实体存在一个默认构造函数)


这就是为什么如果需要,您应该显式添加默认构造函数。

我倾向于只在需要时才编写代码。如果您不需要任何其他构造函数,请让编译器为您生成它。否则,请编写所需的所有构造函数。

这只是样式问题。生成的代码是相同的。有趣的是,这两种观点在工具之间切换了位置。。。PMD现在敦促您使用默认构造函数,而Checkstyle不再真正关心了。它怎么可能不是有意的呢?如果它被使用了,并且没有其他构造函数,那么显然它一定是有意的。你必须去其他地方看看它是否被使用了,在任何情况下,它将来都可能被重构掉。我会说明确声明默认构造函数,然后如果这是一个只有静态方法的库类,则将构造函数标记为private。@andrewmu是的,这是我的意图。+1-我想起了神学上关于有多少天使可以在一个针头上跳舞的辩论……好吧,你也可以初始化声明它们的字段,像public class Util { // no constructor given - implicit default constructor // intended? probably not, but who knows public static void foo() { // blabla } public static void bar() { // more blabla } }
public Book(String name) {
    this.name = name;
}
class Cube {
   private int length;
   private int breadth;
   private int height;

  public Cube() {
      length = 10;
      breadth = 10;
      height = 10;
  }
     ......
     ......
}