我有一个 View 显示我游戏的所有级别。这些级别由 Activity 读取,然后传递到 View 中。我可以从 View 中读取它们,但这并不是它的真正责任,而且我是关注点分离的粉丝。
现在,我正在为此调用 setter:
((GameView) findViewById(R.id.game)).setLevels(loadLevels());
但是,我不喜欢这样的事实,即如果我忘记调用 setter, View 将无法正常工作。有没有更好的方法来传递关卡?
这也有点偏好问题。从理论上讲,按照您的方式通过关卡是完全可以的。或者,如果您不仅需要设置级别,还需要提供更多功能(即还保存级别),我通常使用一个单独的类负责处理此类事情(即一个存储库、一些“管理器”类等)。然后将此类传递到构造函数上的 View 中,最好是 s.t.一个人被迫提供它。当然,为了分离事物,我使用接口(interface)而不是具体的实现s.t.它可能看起来如下:
public class MyView {
public MyView(ILevelLoader levelLoader){
this.levelLoader = levelLoader;
}
...
}
通常,这可能行不通,因为 View 是由框架直接实例化的,而不是由应用程序实例化的。在这种情况下,您被迫通过适当的二传手来完成。这是某种 MVC/MVP 模式。
为了您的兴趣,您可能还想看看 IoC containers和依赖注入(inject)。 Guice由 Google 提供的是一个很好的框架,我已经在 Android 上使用过。
我是一名优秀的程序员,十分优秀!