【问题标题】:How to access variables from an object returned from a getter如何访问从 getter 返回的对象中的变量
【发布时间】:2013-08-02 18:11:23
【问题描述】:

我有一个 Quad 类(用于我的精灵),在这个类中有用于改变所述 Quad 状态的各种变量。所以我可以像这样简单地制作一个精灵:

Quad hero = new Quad();

我有一个 Resource 类,我的所有精灵都在其中保存/创建。

我有一个 Main 类,它 不是 Resource 的相邻类,因此为了避免违反 Demeter 的规则,我在Resource 类(与 Main 相邻)。

但是,由于需要访问的变量太多,有没有更好的方法为每个变量创建 getter/setter?

我想做一些事情,比如能够编写一个简单地返回 Quad 的 getter,这样我就可以在 Main 类中访问它的变量。所以在 Resource 中,我会有这样的东西:

public Quad getQuad(Quad quad){

    return quad;

}

然后在我的 Main 类中,我想要这样的东西:('res' 是我的 Resouce 类的对象)

res.getQuad(hero).variable;

我意识到上述方法行不通 - 这只是我想要实现的目标的一个示例。

或者也许我可以在 getter 本身中放入一些代码,让我可以访问它的任何变量而不是特定变量。

这只是为了让我不必通过这样做来破坏 Demeter,我在很多情况下都确信这是不是好的做法:

res.hero.variable;

如果有任何帮助,将不胜感激。

【问题讨论】:

标签: java variables getter getter-setter law-of-demeter


【解决方案1】:

如果事情不是静态的,您可能有兴趣在此处遵循单例设计模式。

但是,如果资源在您的项目中经常使用 - 但包含静态成员(或您应该返回并使其成为静态的成员) - 那么为所有内容创建 getter 和 setter 是相当愚蠢的。只需将它们设为公共对象并像常量一样访问它们。

现在,如果您想做上面描述的事情(这是一种非常好的方法)- 这当然是可能的。您需要在资源类中保留一个字典,该字典使用某种键来访问成员。您可能希望设置一个 Enum 并将每个成员的名称分配给索引。并使用枚举作为字典的键。这样你就可以像这样访问它:

res.getQuad(Resource.MyEnum.Resource1).variable;

然后资源需要类似:

public Dictionary<MyEnum, Quad> my_quads = new Dictionary<MyEnum, Quad>();

public static enum MyEnum
{
    Resource1 = 0
    Resource2 = 1
    Resource3 = 2
}

public Quad getQuad(MyEnum resource_index)
{
    return my_quads[resource_index];
}

【讨论】:

  • 这太好了 - 谢谢@Paul_R,我会好好通读一遍:-)
【解决方案2】:

如果“变量”是 Quad 的可访问字段,您的示例是正确的。

res.getQuad(hero).variable;

或者您可以将 Quad 分配给局部变量并稍后访问变量

Quad q = res.getQuad(hero);

/* do something with */ q.variable1;

您可以在资源中拥有一个HashMap&lt;String, Quad&gt;,因此您可以使用创建它时使用的某个键来获得一个四边形。如果你有很多的话,这比为所有的四边形编写 getter 更容易。

【讨论】:

  • 问题在于定义“英雄”。如果他已经知道课外英雄是什么,那他到底为什么要得到它?他关心的是启用良好的智能感知和良好的访问原则,以保持可维护的 OOP 设计不会过于复杂,而且干净整洁。对他有好处。
  • 我在您的回答中看到了这个想法。我倾向于使用 map 和 string 键,但 Enum 肯定会让事情变得更容易。
猜你喜欢
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 2021-10-13
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
相关资源
最近更新 更多