【问题标题】:Avoid internal getters/setters - Game避免内部 getter/setter - 游戏
【发布时间】:2010-08-20 07:12:54
【问题描述】:

我正在开发一款游戏。视图、线程和引擎都完成了。现在我将讨论如何将坐标设置为我的位图。

我已经使用 getters/setters-method 成功地做到了这一点。我一直在网上看到大多数优秀的游戏开发者都说“让你的成员变量公开”之类的东西。

自从我阅读了 http://developer.android.com/guide/practices/design/performance.html 的避免内部 Getters/Setters 部分后,我开始想:如何更改我的 Coordinates 类以在没有“setters”的情况下实现这一目标?

现在我的坐标类看起来像:

package com.mygame.mygame;

public class Coordinates {
    int x;
    int y;
    Coordinates instance = null;

 public Coordinates getInstance(){
  if(instance == null){
   instance = new Coordinates();  
  }
  return instance;
 }

    public Coordinates() {    
    }

    public int getX() {
        return x;
    }

    public void setX(int value) { 
        x = value;
    }

    public int getY() {
        return y;
    }
    public void setY(int value) {
        y = value;
    } 

}

我应该如何更改我的代码来实现这一点?方法调用很昂贵,但我仍然不知道如何在没有 getter 和 setter 的情况下重构我当前的代码。

更新

 public GameEngine getInstance(){
 if(instance == null){
  instance = new GameEngine(resources,view);  
  }
  return instance;
  }

更新 2

游戏引擎

    static Resources res;

static GameView view;

static GameEngine instance = null;

public static GameEngine getInstance(Resources localResources, GameView localView){
    view = localView;
    res = localResources;
    if(instance == null){
        instance = new GameEngine(); //Init-stuff in the GameEngine
    }
    return instance;
}

还有我的游戏视图

static GameEngine engine;
public GameView(Context localContext) {
   //Other stuff
   engine = GameEngine.getInstance(context.getResources(), this);
   //Other stuff
}

提前致谢!

【问题讨论】:

    标签: java android


    【解决方案1】:

    您似乎误解了“内部”一词。该文件更多地告诉您,您应该这样做:

    public Coordinates(int x, int y) {
        setX(x);
        setY(y);
    }
    

    但更是如此

    public Coordinates(int x, int y) {
        this.x = x;
        this.y = y;
    }
    

    换句话说,避免在定义它们的相同类中使用getter/setter。

    顺便说一句,您当前的班级在任何地方都没有这样做。在这种情况下,只有 getInstance() 方法毫无意义。我会摆脱它。

    【讨论】:

    • 哇!那讲得通!但是,this 是这样做的吗?从这些角度来看,方法调用不是也很昂贵吗?好吧,我的引擎中有方法调用。
    • 这是正常的做法,是的。至于昂贵,getter/setter 方法调用特别便宜,更多的是风格问题。但在一台只有少量资源且几乎没有 JIT 优化(如手机)的机器上,我想每一次优化都会受到欢迎。
    • 好吧,这就是我要走的路。我用我的 GameEngine 中的一段代码更新了我的代码。这个Instance也是没用的吗?
    • 因为 getInstance() 方法没有被声明为 static,我认为它仍然毫无意义。它不会阻止您创建多个实例。这闻起来太像半生不熟的单身人士了。但这也可能取决于整个上下文。
    • 任何设置标量值的方法调用都会在调用堆栈上产生开销,因此只需公开所有成员即可。它打破了封装和隐藏成员的 Java 心态,但它使代码更快。此示例仍然显示分配两个变量的方法调用。这是原始二传手的 2 倍,但仍然很慢。有关在 android 上使用 java 开发游戏的更多信息,请参阅这些讲座:youtube.com/watch?v=U4Bk5rmIpicyoutube.com/watch?v=7-62tRHLcHk
    【解决方案2】:

    public 是成员的默认设置,除非另有说明。只是不要对 x 和 y 使用 getter 或 setter。

    【讨论】:

    • 默认可见性不公开。与当前代码一样,成员仅对同一包中的类可见。
    猜你喜欢
    • 2011-05-31
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多