替代多个代理' Java中的方法

时间:2014-07-09 00:38:07

标签: java getter-setter readability proxy-classes law-of-demeter

如果我有3个课程,那么为了论证,请打电话给他们:

  • MainActivity
  • GLRenderer
  • OtherClass

请注意, 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 (如果我有很多需要访问的东西,这可能很痛苦。)

1 个答案:

答案 0 :(得分:3)

“上述内容比做这样的事情好吗?”

是的,是的,因为第二种方法违反了封装,允许OtherClass知道GLRenderer是MainActivity的代理。它不是OtherClass的业务,而是GLRenderer如何设置其int值。

从维护角度来看,第一种方法也更好,因为它允许MainActivity(和GLRenderer使用MainActivity)独立于OtherClass进行更改。在第二种方法中,对int值设置方式的更改也需要更改OtherClass。