Java"这个",继承了v传递。有区别吗?

时间:2016-02-19 06:46:42

标签: java android

我有一个类,在类中有一些构造函数(显示三个中的一个)和一些方法。我看到了一些潜在的捷径,我可以使用构造函数中的一些方法。 Android Studio不会抱怨也不会构建。

1)从构造函数调用时,this是否被识别为在方法中被继承? (我假设是这样)代码中的<< === 001

2)(a)通过构造函数调用的方法应用于变量的更改是否会在this引用时将这些更改应用于正构造的对象,或者({b)未被this引用但是由传递的参数? 我想其他所有<< === nnn apply

当然,如果有明显的错误和错误观念,那么我也很感激他们被指出。

无论如何这里是代码(注意课程的摘录)。

// Full constructor
public DBColumn(String column_name, String column_type, boolean primary_index, String default_value) {
    column_type = column_type.toUpperCase();
    column_name = column_name.toLowerCase();

    // Lots of potential values for the column type; so validate
    boolean column_ok = false;
    this.column_type = simplifyColumnType(column_type);                              //<<=== 001
    this.column_name = column_name;
    this.checkDBColumnIsUsable(this,"DBColumn (Full)");                              //<<=== 001
    this.primary_index = primary_index;
    this.default_value = default_value;
}

public void setDBColumnName(String column_name) {                                    //<<=== 002
    this.column_name = column_name;                                                  //<<=== 002
    this.checkDBColumnIsUsable(this,"setDBColumnName");
}

public void setDBColumnType(String column_type) {
    this.column_type = simplifyColumnType(column_type);                              //<<=== 003
    this.checkDBColumnIsUsable(this,"setDBColumnType");
}

private boolean checkDBColumnIsUsable(DBColumn dbcolumn, String caller) {            //<<=== 004
    if(!dbcolumn.usable) {
        if(dbcolumn.column_name.length() > 0 & dbcolumn.column_type.length() > 0) {
            dbcolumn.usable = true;
            dbcolumn.problem_msg = "";
        }
    } else {
        dbcolumn.usable = false;                                                     //<<=== 005
        if(dbcolumn.column_name.length() < 1) {
            dbcolumn.problem_msg=dbcolumn.problem_msg + 
                    "EDBC001 - Invalid Column Name - Must be at least 1 character in length. Caller=(" + caller + ")";
        }
        if(dbcolumn.column_type.length() < 1) {
            dbcolumn.problem_msg=dbcolumn.problem_msg + 
                    "EDBC002 - Invalid Column Type - Must be a valid SQLite DATATYPE. Caller=(" + caller + ")";
        }
    }
    return dbcolumn.usable;
}

2 个答案:

答案 0 :(得分:3)

虽然将DBColumn引用显式checkDBColumnIsUsable传递给DBColumn并不正确,但这是我建议反对的一种风格。

因为它是一个成员函数,所以当你调用它时,已经有一个隐式this实例传递给该方法 - private boolean checkDBColumnIsUsable(DBColumn dbcolumn, String caller) { 。例如,如果您有成员函数

private static boolean checkDBColumnIsUsable(DBColumn $this, DBColumn dbcolumn, String caller) {

然后在封面下调用它,好像它是一个像这样的静态函数:

DBColumn

这意味着您实际上在方法体中有两个对usable = false; 个实例的引用。就其本身而言,这并不是一个太大的问题 - 当然,还有一个问题超出了你的需要,但是开销是微不足道的,而且是不可取的。

但是:你打开这样的bug。例如,您可能会不小心写:

dbcolumn.usable = false;

而不是:

checkDBColumnIsUsable(somethingOtherThanThis, "caller");

对于您当前的使用模式,它看起来像是有效的。但是,如果您要在代码中添加新呼叫,请执行以下操作:

usable

然后错误就会显现出来:this将设置在somethingOtherThanThis上,而不是DBColumn dbcolumn

可以说这是指出不存在的错误。我会在防御性方面反击这种编程 - 因此也不能引入错误 - 这是一个很好的策略。

这里有两个选项:

  1. 只需从方法中删除this参数,然后始终在方法体中引用this(可能隐式);
  2. 使方法保持静态,删除(隐式或显式)引用somethingOtherThanThis的能力。
  3. 其中任何一个都会删除其中一个不必要的引用。我会选择第一个,因为它使代码更简洁;您仍然可以通过调用somethingOtherThanThis.checkDBColumnIsUsable("caller")来调用<div ng-app='app'>的方法。

答案 1 :(得分:2)

  1. 在您的情况下,使用this来限制您的变量。无论何时在方法中使用this.field(即使在构造函数中),它都会引用实例变量。如果你在没有this的情况下使用它,那么它可以首先引用参数参数或方法中定义的变量;只有没有,那么它才会引用实例变量。