Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
EditText.java代码中的这个注释是什么意思?_Java_Android_Android Edittext - Fatal编程技术网

EditText.java代码中的这个注释是什么意思?

EditText.java代码中的这个注释是什么意思?,java,android,android-edittext,Java,Android,Android Edittext,我已经看过了,在第109行,下面的评论可以在 getText()方法: // This can only happen during construction. 它的目的是什么 感谢注释的目的是告诉任何认为下一条语句是多余的程序员,即文本永远不能为空,它们是错误的,因为这可能发生在编辑文本对象的构造过程中,所以不要删除该语句。我将扩展Andreas的回答,为这一特定类别定制 EditText是TextView的子类。这就是为什么它被宣布为: 类编辑文本扩展文本视图(简化…) EditText构

我已经看过了,在第109行,下面的评论可以在
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;
}