EditText.java代码中的这个注释是什么意思?
我已经看过了,在第109行,下面的评论可以在EditText.java代码中的这个注释是什么意思?,java,android,android-edittext,Java,Android,Android Edittext,我已经看过了,在第109行,下面的评论可以在 getText()方法: // This can only happen during construction. 它的目的是什么 感谢注释的目的是告诉任何认为下一条语句是多余的程序员,即文本永远不能为空,它们是错误的,因为这可能发生在编辑文本对象的构造过程中,所以不要删除该语句。我将扩展Andreas的回答,为这一特定类别定制 EditText是TextView的子类。这就是为什么它被宣布为: 类编辑文本扩展文本视图(简化…) EditText构
getText()
方法:
// This can only happen during construction.
它的目的是什么
感谢注释的目的是告诉任何认为下一条语句是多余的程序员,即
文本
永远不能为空
,它们是错误的,因为这可能发生在编辑文本
对象的构造过程中,所以不要删除该语句。我将扩展Andreas的回答,为这一特定类别定制
EditText
是TextView
的子类。这就是为什么它被宣布为:
类编辑文本扩展文本视图
(简化…)
EditText构造函数如下所示:
public EditText(Context context) {
this(context, null);
}
public EditText(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.editTextStyle);
}
public EditText(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
public EditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
注意在最后一个(长的)构造函数之前,每个构造函数是如何调用另一个的。
这是一个棘手的问题,因为它调用了super(…)
,这意味着它现在正在调用super类的构造函数(TextView
)
EditText只是一个专门的文本视图,我们可以由此推断;TextView还声明了一个名为text
的变量,EditText当然也使用该变量。当您向EditText请求文本时,它只会使用TextView已有的代码以及您发现的代码:
@Override
public Editable getText() {
CharSequence text = super.getText();
// This can only happen during construction.
if (text == null) {
return null;
}
[rest of code removed for clarity]
}
因此,它向其超级
(文本视图)请求文本
;为什么这个文本可以为空?要回答这个问题,您需要查看TextView
本身()
大约1000行代码之后…TextView声明了它的构造函数;为了简单起见,我将粘贴一个,但它们非常简单:
public TextView(Context context) {
this(context, null);
}
注意,他们再次调用this(…)
并链接构造…一个构造函数调用另一个,以此类推…直到到达TextView的最后一个大构造函数
@SuppressWarnings("deprecation")
public TextView(
Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
// TextView is important by default, unless app developer overrode attribute.
if (getImportantForAutofill() == IMPORTANT_FOR_AUTOFILL_AUTO) {
setImportantForAutofill(IMPORTANT_FOR_AUTOFILL_YES);
}
setTextInternal("");
[rest of code removed for clarity]
注意,这个构造函数调用了setTextInternal(“”
),看起来很可疑!它在构造时将文本设置为空字符串,因此TextView
在该构造函数完成后不可能有空文本(您可以使用反射…但我们不要这样做);由于EditText
构造函数是链接的,并且最终总是调用TextView
构造函数,因此setTextInternal(“”
方法保证在Java对象构造过程中的某个时刻被调用。(这就是构造函数,这是一个Java契约,如果它不可靠,它将打破世界的1/2!)
这个方法有什么作用
显然,一堆内部的东西,还有其他
// Update mText and mPrecomputed
private void setTextInternal(@Nullable CharSequence text) {
mText = text; // #### THIS IS WHERE IT SETS THE TEXT TO NON NULL ("").
mSpannable = (text instanceof Spannable) ? (Spannable) text : null;
mPrecomputed = (text instanceof PrecomputedText) ? (PrecomputedText) text : null;
}
如果您还记得EditText#getText()
调用了super.getText()
猜猜在super中是什么样子?(查看TextView
):
没错,与在TextView构造期间修改的setTextInternal()
相同的mText
引用/实例
这就是为什么在构造期间(以及调用setTextInternal(“”
)之前,mText
(通过getText()
访问的)字段可以为空,但不能在之后为空
”\_(ツ)_/“
老实说,我甚至不知道他们为什么这样做,而且评论似乎有点傻,但正如您可能已经猜到的,这些类有数千行代码,人们倾向于相信这一定是有原因的;您最好开始分析整个TextView类。祝您好运。:)评论的目的是告诉程序员(人类)something.text==null只能在构造函数中出现,一旦构造函数完成,它就不为null。@AIMINPAN thks,当你说构造函数完成后它不为null时,你能告诉我更多吗?@H.Riantsoa这意味着在构造函数完成执行后,文本将永远不会为null。如果你不理解这个短语“一旦构造函数完成”,我的建议是阅读Java官方文档,了解构造函数;它们非常重要:)(在URL的示例中,在Bicycle
对象的构造函数中初始化的变量保证在构造函数完成后分配(当执行ctor中的所有代码时)。
public CharSequence getText() {
return mText;
}