字段类型 'myField' 是具体的 class 'MyClass'

Type of field 'myField' is concrete class 'MyClass'

我正在准备我的 android 生产应用程序,因此我启用了大多数 lint 警告。一个特别的警告广为流传,但我不明白。

这是警告:

Type of field 'loginF' is concrete class 'LoginFragment'

这里是描述:

Reports any instance fields whose type is declared to be a concrete class, rather than an interface. Such declarations may represent a failure of abstraction, and may make testing more difficult. Declarations whose classes come from system or third-party libraries will not be reported by this inspection.

如有详细说明,我们将不胜感激。
注意:我用的IDE是'Android Studio'.

它在抱怨,因为您将此 class(其中包含 loginF 字段)与 LoginFragment 耦合;如果您更改 LoginFragment,则可能需要更改此 class.

或者,查看您在此 class 中的 LoginFragment 上使用的方法。它们是否共同形成了您可以在界面中指定的某些行为?

例如如果您在 loginF 上调用的唯一方法是 initiateLogin(),那么也许您可以:

interface Login {
    void initiateLogin();
}

class LoginFragment extends Fragment implements Login {
    @Override
    public void initiateLogin() {
        // do login
    }
}

这样您就可以使用 Login login = new LoginFragment().

而不是声明 LoginFragment loginF = new LoginFragment();

然后你可以更改 LoginFragment 只要它保留 initiateLogin() 方法,甚至可以将 new LoginFragment() 换成 Login 的任何其他实现,这可能会有用用于测试中的模拟。

一个非常人为的例子。我建议使用默认的 lint 配置,而不是这个超级严格的配置。