1

如果我有3類,讓我們爲了討論打電話給他們:替代多個 '代理' 方法的Java

  • MainActivity
  • GLRenderer
  • OtherClass

請注意,GLRenderer不是單純的代理類,但確實包含了一些代理的方法。

MainActivity初始化一個名爲的值int。現在,如果其他類別需要更改該值,無論什麼原因,它只能直接訪問GLRenderer類(它可以訪問MainActivity類,訪問此變量的最佳方式是什麼?

目前,我使用的setter方法在MainActivity,然後用另一二傳手在GLRenderer(代理方法真的,因爲它只需通過傳遞值)。

這工作正常這是我目前正在做的事情一些僞代碼(我知道這些代碼可能無法編譯,這純粹是對這個問題的目的):

主要活動

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,但使用上面的方法,我可以不必重複有效的getter我/ setter方法(它可以是一個痛苦,如果我有很多的事情,我需要訪問)從MainActivity訪問任何東西。

回答

3

「比做這樣的事情上面更好嗎?」

是的,它是,因爲第二種方法允許OtherClass知道GLRenderer是MainActivity代理違反了封裝。與其他類的業務無關,GLRenderer如何設置其整型值。

從維護的角度來看,第一種方法也更好,因爲它允許MainActivity(和GLRenderer的MainActivity的使用)獨立於OtherClass進行更改。在第二種方法中,對int值設置方式的更改也需要改變OtherClass。