【问题标题】:Commenting a default constructor when writing a class编写类时注释默认构造函数
【发布时间】:2017-03-02 20:17:04
【问题描述】:

在我的 Java 基础课中,我的老师告诉我在为类编写默认构造函数时所做的任何任意选择都需要注释。 (她告诉我们,我们必须为我们设计的每个类创建一个默认构造函数)所以例如,我正在编写一个名为 RoomDimension 的类,我创建了一个默认构造函数,如下所示:

public class RoomDimension {

    //Fields
    private double length;          //Length of a carpet
    private double width;           //Width of a carpet

/**
*
*/
public RoomDimension(){ 
        length = 0.0; 
        width = 0.0;
    }

我在这里使用 0.0 作为我的标志,表示用户没有输入任何内容或输入无效。然后我应该评论 0.0 被用作文档注释(/**/)中无效输入的指示这一事实吗?我知道如果我使用 -1 作为我的标志(或默认构造函数中字段的初始化),我肯定会评论 -1 表示无效输入,因为我是任意做出的决定。我在问是否必须评论 0,因为我不知道 0 是否是任意选择。作为程序员,您会费心指出这一点吗?或者,如果我只是假设用户知道它而不告诉他们,这可以吗?

【问题讨论】:

  • “她告诉我们,我们必须为我们设计的每个类创建一个默认构造函数” 我简直不敢相信!您的老师应该知道,编译器会为没有显式编写构造函数的类创建默认构造函数。您的示例本身也说明了为什么 just to have one 的默认构造函数是邪恶的:您永远不知道属性中的值是否有效。至少您每次访问它们时都必须进行检查。

标签: java constructor documentation comments default-constructor


【解决方案1】:

至于是否应该注释零,我认为最好表明它是一个标志,以便将来提醒自己,或任何其他查看您的代码的程序员。

至于使用零作为标志,我认为最好在长度和高度小于或等于零时抛出异常。当用户输入一个非正数时,它会更容易阅读,并且处理起来更有效。

【讨论】:

    【解决方案2】:

    她告诉我们必须为每个类创建一个默认构造函数 我们设计的

    我替我的老师说:谁不知道在教,谁知道在做!

    如果你不创建默认构造函数,编译器会这样做,你知道吗? - 你的老师呢?

    如果没有找到已编译的“默认构造函数”,许多生成、转换数据的工具会哭闹、唠叨、崩溃。但他们会完全忽略 cmets。

    回到你的课堂:

    public class RoomDimension {
    
     static {
      System.out.println("I an a static initializer, If the classloader will touch your class, I will be called first! ex. RoomDimension.anyStaticmethod() or before new RoomDimension()");
     }
    
     {
      System.out.println("I am instance initializer. whenever you call any constructor, I will run before the constructor body, try me with: new RoomDimension()");
     }
    
     //Fields
     private double length; //Length of a carpet
     private double width; //Width of a carpet
    
     public RoomDimension() {
      length = 0.0;
      width = 0.0;
     }
    }
    

    顺便说一下你的代码:

    public RoomDimension() {
      length = 0.0;
       width = 0.0;
     }
    

    它完全没用,因为在构造函数之前,它将是一个初始化,并且会完全一样,因为你已经声明为属性并且它们将在构造函数之前被初始化:

     private double length; //Length of a carpet
     private double width; //Width of a carpet
    

    如果您想知道它是否已初始化,请使用 Double 而不是 double 并检查 null 值。

    例如:

    private Double length; //Length of a carpet
    private Double width; //Width of a carpet
    

    【讨论】:

    • 感谢您的回答。我问她是否可以省略默认构造函数,因为我的教科书指出,如果我没有,java编译器会为我提供一个,她说编译器只有在没有时才会为我做我班上的其他构造函数。这是真的吗?然后我应该仅仅为了一种习惯而创建一个吗?
    【解决方案3】:

    我会将它们的值设置为可为空。

        public class RoomDimension 
    {
    private double? length;
    private double? width;
    
    }
    
        public RoomDimension()
    {  
    
    }
    

    这对您的作用是允许长度和宽度的值取空值。所以当你调用默认构造函数时,它们会自动设置为null。

    这将帮助您开始考虑对象,因为当您拥有包含其他对象的对象时,您无法将所有包含的对象设置为 0.0,您只需创建一个空对象。此外,当您对该对象执行操作时,您只需事先检查其是否为空,这有助于避免空引用异常。

    【讨论】:

    • 不是C#的问题。
    • 对不起换双了?加倍,你在java中
    猜你喜欢
    • 1970-01-01
    • 2014-10-16
    • 2017-07-15
    • 2015-11-30
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多