什么是更实用,两个属性或具有所述属性的一个对象?

时间:2013-05-11 14:59:52

标签: java

如果这个地方不合适,请在关闭问题之前指出我在哪里可以讨论/解决我的疑惑。

这是我脑子里想的一点点。在Java,也许还有其他OOP语言中,有什么比这更好的了......

class Entity {
  [final] int xPos;
  [final] int yPos;

  // ...
}

或者更确切地说......

class Entity {
  Position p;

  // ...
}

class Position {
  [final] int x;
  [final] int y;
}

这有什么优点和缺点?对我来说,使用第二种方法似乎更实际,特别是当您需要输入两个属性作为方法参数或返回值时,但我也在考虑是否会产生太多不需要的过程(为次要事物创建新对象) ...

3 个答案:

答案 0 :(得分:2)

或者您可以不编写自定义类并使用Point。真的,这取决于你。如果你需要执行涉及坐标的计算,或者需要绕过很多对象的坐标,那么最好将它们包装在一个对象中以保持代码更简单。如果它们是不变的,并且永远不会改变(你永远不会真正知道),那么你可以将它们保持为int值。

答案 1 :(得分:2)

如果它代表具有独立目的的东西,那么你真的只需要一个单独的类定义 - 因此将来可能需要其他地方或包含独立的功能(责任分工)。正如克里斯提到的,你的例子直接与Point类有关,所以后者更合适。

答案 2 :(得分:1)

都不是。最好的设计如下:

class Position {
    final int x;
    final int y;
}

interface Positionable {
    Position getPosition();
}

class Entity implements Positionable {
    private Position p;
    public Position getPosition() {
        return position;
    }
}

推理:

  • 允许Position进化 - 也许您想要添加z坐标
  • 允许Position不可变
  • 允许Position传递而不包含在较重物体中的行李
  • 允许您自由地向Position添加方法,例如float distanceFrom (Position p)
  • 允许Position超过其描述的对象
  • 允许其他类轻松获得Position
  • 尽可能多地解决各种问题

请注意Point是可变的,因此从良好的设计角度来看,使用它或扩展它是不合适的,因为不可变性似乎是这样一个类的明智选择(它被认为是Point可变的错误 - 对于其他“java中的错误”,请参阅this answer