字段类型 '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 配置,而不是这个超级严格的配置。
我正在准备我的 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 配置,而不是这个超级严格的配置。