了解字段访问表达式

时间:2015-06-02 16:57:43

标签: java android

以下是GameObject.java类的代码:

package com.badlogic.androidgames.gamedev2d;

import com.badlogic.androidgames.framework.math.Rectangle;
import com.badlogic.androidgames.framework.math.Vector2;

public class GameObject {
    public final Vector2 position;
    public final Rectangle bounds;

    public GameObject(float x, float y, float width, float height) {
        this.position = new Vector2(x,y);
        this.bounds = new Rectangle(x-width/2, y-height/2, width, height);
    }
}

Rectangle.java的代码:

package com.badlogic.androidgames.framework.math;

public class Rectangle {
    public final Vector2 lowerLeft;
    public float width, height;

   public Rectangle(float x, float y, float width, float height) {
       this.lowerLeft = new Vector2(x,y);
       this.width = width;
       this.height = height;
   }
}

Vector2.java的代码段:

package com.badlogic.androidgames.framework.math;

public Vector2(float x, float y) {
    this.x = x;
    this.y = y;
}

SpatialhashGrid.java的代码片段:

package com.badlogic.androidgames.gamedev2d;

import java.util.ArrayList;
import java.util.List;

import android.util.FloatMath;

public class SpatialHashGrid {
    List<GameObject>[] dynamicCells;
    List<GameObject>[] staticCells;
    int cellsPerRow;
    int cellsPerCol;
    float cellSize;
    int[] cellIds = new int[4];
    List<GameObject> foundObjects;

    public int[] getCellIds(GameObject obj) {
        int x1 = (int)FloatMath.floor(obj.bounds.lowerLeft.x / cellSize);
        int y1 = (int)FloatMath.floor(obj.bounds.lowerLeft.y / cellSize);
        int x2 = (int)FloatMath.floor((obj.bounds.lowerLeft.x +     obj.bounds.width) / cellSize);
        int y2 = (int)FloatMath.floor((obj.bounds.lowerLeft.y + obj.bounds.height) / cellSize);

    if(x1 == x2 && y1 == y2) {
        if(x1 >= 0 && x1 < cellsPerRow && y1 >= 0 && y1 < cellsPerCol)
            cellIds[0] = x1 + y1 * cellsPerRow;
        else
            cellIds[0] = -1;
        cellIds[1] = -1;
        cellIds[2] = -1;
        cellIds[3] = -1;
    }

每当我阅读任何Java书籍时,他们总会提到Demeter法则。不是这条线:

int x1 = (int)FloatMath.floor(obj.bounds.lowerLeft.x / cellSize);
违反这项法律?既然我从未使用过像这样的惯例,我似乎无法理解这条线是什么意思?如何使用点(。)运算符在同一行中使用3个对象?

4 个答案:

答案 0 :(得分:1)

可能是Information hiding在示例中并不是必需的。

答案 1 :(得分:1)

#

以上一行是以下的同化线:

textarea

开发人员选择将它们级联成一行,而不是声明单独的变量。由于它们是int x1 = (int)FloatMath.floor(obj.bounds.lowerLeft.x / cellSize); 变量,因此可以通过Rectangle bounds1 = obj.bounds; Vector2 lowerLeft1 = bounds1.lowerLeft; float xtemp = lowerLeft1.x; int x1 = (int)FloatMath.floor(xtemp / cellSize); 运算符访问它们,即。 public

答案 2 :(得分:1)

class A {
  public int b;
}
A a = new A();
int c = a.b;

点表示访问名为的成员。在我的例子中,访问对象a的成员b。

它很少见,因为它涉及直接访问对象的成员变量,这几乎总是不好的做法。

答案 3 :(得分:1)

简而言之,德米特法则建议您只应与您的直接朋友交谈;不要和陌生人说话。&#34;

在您的示例中,语句obj.bounds.lowerLeft.x违反了此原则,因为不仅访问obj变量的属性,对象图(x)中的远程变量也是如此直接阅读。

这是可能的,因为Java支持链接对成员变量(和非void方法)的调用。然而,&#34;与陌生人谈话&#34;像这样是反模式,因为它使重构您的代码变得困难;重命名变量之类的小变化可能会破坏直接使用变量的其他类中的代码