2012-08-03 128 views
0

我正在尋求減少Android項目中的冗餘代碼。讓我告訴你我已經擁有了什麼。我有兩個主要的觀點組。一個叫做MapView,它是一個包含可以縮放,平移等位圖的視圖。另一個稱爲StepInfoView,它是一個包含靜態數據的視圖,例如座標數組和關於這些座標的信息。這個視圖也是放大並且以與MapView相同的方式移動,但是,放大的比例因子和數量需要獨立於MapView。Java繼承:抽象類中的「Casting」變量爲靜態

StepInfoView擴展了幾個不同的類(總共6個),所有這些類都需要同步(座標繪製在一個座標之間的線被繪製在另一個上,等等)。

所以,這裏是我的代碼的要點,目前:

public class MapView extends View 
{ 
    protected float scale = 1; 

    protected class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener 
    { 
     @Override 
     public boolean onScale(ScaleGestureDetector detector) 
     { 
      scale *= detector.getScaleFactor()); 
      return true; 
     } 

    } 

    } 
... 

public class StepInfoView extends View 
{ 
    static protected float scale = 1; 
    protected class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener 
    { 
     @Override 
     public boolean onScale(ScaleGestureDetector detector) 
     { 
      scale *= detector.getScaleFactor()); 
      return true; 
     } 

    } 
} 
... 
public class StepView extends StepInfoView 
{ 
    // Custom onDraw, same scale as PathView 
} 
public class PathView extends StepInfoView 
{ 
    // Custom onDraw, same scale as StepView 
} 

正如你看到的,onScales是相同。我想創建一個抽象類來保存縮放功能,讓我們稱之爲RootView。 MapView和StepInfoView都具有比例尺,但是我無法在RootView中進行比例縮放,因爲MapView比例尺必須獨立於StepInfoView。這裏是我知道將工作的解決方案,但我不喜歡getter和setter的混亂:

abstract class RootView extends View 
{ 
    abstract protected float getScale(); 

    abstract protected void setScale(float s); 
    protected class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener 
    { 
     @Override 
     public boolean onScale(ScaleGestureDetector detector) 
     { 
     setScale(getScale() * detector.getScaleFactor()); 
     return true; 
     } 
    } 
} 
... 
public class MapView extends RootView 
{ 
    public float scale = 1; 
    protected float getScale(){ 
     return scale; 
    } 

    protected void setScale(float s){ 
     scale = s; 
    } 
} 

public class StepInfoView extends RootView 
{ 
    public static float scale = 1; 
    protected float getScale(){ 
     return scale; 
    } 

    protected void setScale(float s){ 
     scale = s; 
    } 
} 
public class StepView extends StepInfoView 
{ 
    // Custom onDraw, same scale as PathView 
} 
public class PathView extends StepInfoView 
{ 
    // Custom onDraw, same scale as StepView 
} 

這工作正是我想要的工作,但再次,有重複相同的代碼( getter和setter以及MapView和StepInfoView中的「scale」變量)。

我希望我能做的是在RootView中聲明一個非靜態的縮放,並在StepInfoView中將它「靜態」轉換爲靜態。這不可能...

你能幫我嗎?

回答

0

爲什麼不把scale字段變成RootView類?

更新:明白了。我認爲有一個聚合的地方:爲stepinfo scale值做一些對象容器,並通過StepInfoView的。無論如何,我認爲最簡單的方式就是使用getters。

+0

我需要在StepInfoView中保持靜態。如果我在RootView中將其設爲靜態,那麼StepInfoViews和MapViews將不會相互獨立地進行縮放。 – androidnotgenius 2012-08-03 11:37:54

+0

「爲stepinfo scale值創建一些對象容器,並通過StepInfoView的」 「對不起,但我不明白你的建議。 – androidnotgenius 2012-08-03 11:42:15

1

浮動花費大約4個字節。有另一個類將使用比這更多的內存。由於對象通常是8字節對齊的,所以它甚至可能不會使對象變小。

如果你想避免複雜性,我會離開字段非靜態。

你可以有

class RootView { 
    protected final float[] scale; 

    RootView() { 
     scale = new float[] { 1.0f }; 
    } 

    protected RootView(float[] scale) { 
     this.scale = scale; 
    } 

    public boolean onScale(ScaleGestureDetector detector) { 
     scale[0] *= detector.getScaleFactor(); 
     return true; 
    } 
} 

class StepInfoView extends RootView { 
    static final float[] scale = { 1.0f }; 

    StepInfoView() { 
     super(scale); 
    } 
+0

我不關心這個應用程序的內存。如果將字段保留爲非靜態,則需要更新擴展了StepBaseInfo的所有類,如果縮放更改。 – androidnotgenius 2012-08-03 11:39:27

+0

在我的編輯中添加一個替代方案。 – 2012-08-03 11:45:57

+0

因此,這隻適用於規模,但我也有一個變量「位置」,爲MapView和StepInfoViews平移的量,它以與scale相同的方式進行處理(對於Map而言是非靜態的,對於StepInfo是靜態的)。我可以在MapView和StepInfoView中做super.pan(x,y)嗎? – androidnotgenius 2012-08-03 11:48:51

0

移動的規模場監聽,並提供獲取和設置。

在該視圖中,保留對偵聽器的引用,以便可以訪問該比例。

對於MapView,爲每個視圖實例註冊一個不同的偵聽器,以使它們具有不同的比例。

對於StepInfoView,爲每個視圖實例註冊相同的偵聽器,以使它們具有相同的縮放比例。您可以將偵聽器的引用存儲在靜態字段中。

+0

我真的想避免吸氣劑和吸附劑.. – androidnotgenius 2012-08-03 11:53:02

+0

如果你有兩個對象進行通信,你需要方法來讓他們進行通信。由於您只有一個值可以從偵聽器與視圖進行通信,您可以在兩者之間共享一個字段(正如您所看到的那樣易碎且會導致重複),或者您有一個將值推入視圖的函數(一個setter)或一個函數,其中的值是從偵聽器(一個getter或一個公共字段)中拉取的。從同一個監聽器獲取多個視圖比通過監聽器推送多個視圖更簡單。 – 2012-08-03 11:56:27