如果我有3个课程,那么为了论证,请打电话给他们:
请注意, GLRenderer 不仅仅是一个代理类,但确实包含一些代理方法。
MainActivity 初始化一个名为 value 的int。现在,如果 OtherClass 因任何原因需要更改该值,并且只能直接访问 GLRenderer 类(后者可以访问 MainActivity class,访问此变量的最佳方法是什么?
目前,我在 MainActivity 中使用了setter方法,然后在 GLRenderer 中使用了另一个setter(实际上是一个代理方法,因为它只是传递了值)
这很好用,我现在正在做的事情。这是一些伪代码(我意识到这段代码可能无法编译,这纯粹是出于这个问题的目的):
主要活动
public class MainActivity extends Activity {
private int value;
public setValue(int valueToSet){
value = valueToSet;
}
}
第二课
public class GLRenderer {
private MainActivity activity;
public GLRenderer(MainActivity activity){
this.activity = activity;
}
public setValue(int value){
activity.setValue(value);
}
}
其他类
public class OtherClass {
private GLRenderer glRenderer;
public OtherClass(){
this.glRenderer = glRenderer;
}
public someMethod(){
glRenderer.setValue(5);
}
}
上述内容是否比这样做更好:(请参阅 OtherClass 代码中的评论)
GLRenderer
public class GLRenderer {
private MainActivity activity;
public GLRenderer(MainActivity activity){
this.activity = activity;
}
public MainActivity getActivity(){
return activity;
}
}
其他类
public class OtherClass {
private GLRenderer glRenderer;
public OtherClass(){
this.glRenderer = glRenderer;
}
public someMethod(){
//I know this is considered bad.....
glrenderer.activity.setValue(5);
//But how about this - is this any different/better and if so, why?
glRenderer.getActivity().setValue(5);
}
}
我知道第一种方法需要在 OtherClass 中使用较短的最终指令,但使用上述方法,我可以从 MainActivity 访问任何内容,而无需有效复制我的getter / setter (如果我有很多需要访问的东西,这可能很痛苦。)
答案 0 :(得分:3)
“上述内容比做这样的事情好吗?”
是的,是的,因为第二种方法违反了封装,允许OtherClass知道GLRenderer是MainActivity的代理。它不是OtherClass的业务,而是GLRenderer如何设置其int值。
从维护角度来看,第一种方法也更好,因为它允许MainActivity(和GLRenderer使用MainActivity)独立于OtherClass进行更改。在第二种方法中,对int值设置方式的更改也需要更改OtherClass。