java - 使用 'this' 作为不良编码习惯的显式构造函数调用?

标签 java constructor this

一位教授告诉我,使用 this 显式调用构造函数是“糟糕的编码实践”,并因此受到处罚。但是,我无法在任何 java 样式指南中找到任何我已经以某种方式查看过关于它的评论的内容。最重要的是,它似乎是在我见过的相当多的编码示例中完成的。我希望得到一些关于这是否是糟糕的编码实践以及原因的意见。

我所指的例子:

public class SomeClass {

    private int a;
    private int b;

    public SomeClass() {
        this(0);
    }

    public SomeClass(int a) {
        this(a, 0);
    }

    public SomeClass(int a, int b) {
        this.a = a;
        this.b = b;
    }
}

编辑: 他的评论恰恰是“一个构造函数调用同一个类的构造函数不是好的做法。一个构造函数创建一个对象,因此调用一个调用另一个构造函数的构造函数在内存中发生了什么?一些事情。”

这是具体的代码:

public class Employee {
    private String name;
    private int monthlySalary;

    // Default constructor
    public Employee() {
        this("", 0);
    }

    // Constructor
    public Employee(String name, int monthlySalary) {
        this.name = name;
        this.monthlySalary = monthlySalary;
    }

    // annualSalary() method returns the annual salary of the employee as an int
    public int annualSalary() {
        return monthlySalary * 12;
    }

    // toString() method returns the employee name and monthly salary as a 
    // String in the format: name, monthly salary
    public String toString() {
        return "Name: " + name + "\t\tMonthly Salary: " + monthlySalary;
    }
}

最佳答案

一般来说,使用this 来链接构造函数是不错的风格。在特定示例中它可能是糟糕的风格,但我只准备根据特定代码做出判断。无法判断人工示例(例如您问题中的无语义示例)。

可能您的讲师实际上已经在另一个问题上“通知”了您;例如

  • 创建大量不必要的/令人困惑的/语义困惑的构造函数重载,或者
  • 没有为构造函数重载编写像样的 javadoc。

这两种(在我看来)都是糟糕的风格,因为它们会使您的代码更难阅读和维护。


有争议的是,当您链接构造函数时,您需要查看更多构造函数以了解正在发生的事情。但相反的论点是,让所有构造函数(人为地)独立违反了 DRY 原则。

关于java - 使用 'this' 作为不良编码习惯的显式构造函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37268817/

相关文章:

java - 等差数列中的前 1,000 个数 1, 4, 7, 10

java - JNI FindClass 找不到使用 jar 的类

constructor - 抽象类的 Fortran 构造函数初始化私有(private)变量

javascript - JQuery 插件 : Function using $(this) inside the plugin's options

java - 完全删除 jtable 网格(单元格边框)

仅 Java 注解处理

Delphi - 智能指针构造函数的奇怪行为

c++ - 自定义类/对象的构造函数和初始化

javascript - this.setState 不是函数,.bind(this) 也不是函数

javascript - 如何在Javascript中从子类对象访问父类属性