我有一个类,在类中有一些构造函数(显示三个中的一个)和一些方法。我看到了一些潜在的捷径,我可以使用构造函数中的一些方法。 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;
}
答案 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
。
可以说这是指出不存在的错误。我会在防御性方面反击这种编程 - 因此也不能引入错误 - 这是一个很好的策略。
这里有两个选项:
this
参数,然后始终在方法体中引用this
(可能隐式); somethingOtherThanThis
的能力。其中任何一个都会删除其中一个不必要的引用。我会选择第一个,因为它使代码更简洁;您仍然可以通过调用somethingOtherThanThis.checkDBColumnIsUsable("caller")
来调用<div ng-app='app'>
的方法。
答案 1 :(得分:2)
是
在您的情况下,使用this
来限制您的变量。无论何时在方法中使用this.field
(即使在构造函数中),它都会引用实例变量。如果你在没有this
的情况下使用它,那么它可以首先引用参数参数或方法中定义的变量;只有没有,那么它才会引用实例变量。