Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.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 爪哇语;这";在构造函数中_Java_Constructor - Fatal编程技术网

Java 爪哇语;这";在构造函数中

Java 爪哇语;这";在构造函数中,java,constructor,Java,Constructor,这是一个非常基本的问题,我从未用java编写过代码,但我正在为一位朋友编写一个类。。。有类似于: class myClass{ private string name; public string getName() { return this.name; } public void setName (int newValue) { this.name = newValue; } private int n

这是一个非常基本的问题,我从未用java编写过代码,但我正在为一位朋友编写一个类。。。有类似于:

class myClass{

    private string name;
    public string getName() {
        return this.name;
    }   
    public void setName (int newValue) {
        this.name = newValue;
    }

    private int number;
    public int getNumber() {
        return this.number;
    }   
    public void setNumber (int newValue) {
        this.number = newValue;
    }
}  
我想建造这个建筑的方式是:

public myClass (string name, int numbers) {
    this.name = name;
    this.number = number;
}
我的问题是:

  • 我对属性和参数使用相同的标识符。“这个”能避免麻烦吗
  • 使用set方法更好吗?如果是,我应该使用“this”吗
    非常感谢

    让参数使用与字段相同的名称没有问题;
    this.
    显式消除歧义,程序将按预期运行

    根据您的程序,使用setter而不是直接写入字段可能有利,也可能不利。如果直接在构造函数中写入值,那么就可以绕过setter中可能存在的任何运行时检查,这可能会导致对象保存通常无法保存的数据。另一方面,如果setter试图使用旧值执行某些操作,那么您可能不想调用setter,因为在构造函数中,可能没有有意义的旧值。我要说的是,在构造函数中设置字段并不比使用setter更好或更糟,只要您小心避免破坏类不变量

  • 是,
    区分实例变量和同名的方法参数变量
  • 关于构造函数还是setter初始化更好,一直存在争论。如果您只打算在第一次创建对象时设置名称和编号,并且以后不需要更新这些变量,那么只使用构造函数而不使用setter可能会更好。是的,在setter中,如果参数与要设置的字段同名,则需要使用
    this
  • 对。使用
    这个
    关键字可以避免问题

  • 如果get/set方法中有逻辑,那么应该使用它们。否则,在构造函数中设置值是有效的

  • 是的,它避免了名称冲突。在构造函数的上下文中,name
    name
    表示参数,name
    this.name
    表示实例字段
  • 取决于“更好”的含义。就我个人而言,我会将
    名称
    数字
    字段设置为最终字段,因此类是不可变的。根据我的经验,最好从一个不可变的类定义开始,只有在有正当需要的情况下才朝着可变的方向发展
  • 1) 当对象范围属性与参数名称相同时,必须使用
    this
    来区分它们。当出现名称冲突时,本地变量或参数将优先于属性

    出于这个原因,我不希望每个人都有完全相同的名字,因为这很容易导致bug

    2) 我还将在构造函数中使用setter,因为如果在设置时需要对参数进行验证或其他操作,您只需在一个地方进行更改。否则就是重复,违反了原则

    我会:

    public myClass (string name, int number) { setName( name ); setNumber( number ); } 公共myClass(字符串名称、整数){ 集合名(名称); setNumber(数字); }
    是的,
    这个。
    避免了问题。有些人推荐这种方式,比如他们书中的Rogue Wave

    处理这一问题的其他常见方法有:

    使用前缀“m”或“m_”命名成员

    private string m_name;
    private int m_number;
    public myClass(string name, int number) {
        m_name = name;
        m_number = number;
    }
    
    使用不同的名称调用参数,通常是单个字母或成员名称的缩写版本

    private string name;
    private int number;
    public myClass(string nam, int num) {
        name = nam;
        number = num;
    }
    

    但是我更喜欢你现在使用
    这个

    的方式,我真的不喜欢在字段上使用前缀。您不需要将字段名与它的类型或范围混在一起。我同意你的第二种方法。我只是提到了常见的不同风格。