Java访问器/ mutators - 编程形式

时间:2010-07-31 04:25:37

标签: java

我刚开始一个涉及为hex制作AI的项目。

我已经习惯使用java,这是一种我很少有经验的语言。

关于访问者和变异者,我有几个问题。

  1. 使用访问器/更改器有什么好处?我不明白这一点
  2. 我有一块由瓷砖组成的板子。我已经制作了一个板类和瓷砖类。板对象由多维瓷砖阵列组成。板类中的tile的mutator是否应该通过为坐标设置两个额外的参数来设置数组或数组中的每个单独的tile?什么是更好的编程形式?
  3. 由于

4 个答案:

答案 0 :(得分:3)

  

使用访问器/更改器有什么好处?

有很多:

  • 隐藏getter和setter背后的状态使您可以更灵活地更改类状态的内部表示,而不会破坏使用该状态的其他类。

  • Getter和setter允许类在访问或变异状态时执行操作。例如,setter可以在设置之前进行验证,触发事件等。 Getters可以返回数组或集合属性的副本,以避免让类状态暴露于意外(或故意/恶意 - 见下文)更改的可能性。

  • 可以同步吸气剂和制定者。

  • Getters和setter(如果根据“java bean”规则实现)启用各种对象“连线”框架。

吸气剂和制定者的缺点很小:

  • 任何半合适的Java IDE都可以在几次击键中为属性生成一个getter / setter对。如果你让你的IDE生成你的getter和setter,它们也不会有错误。

  • 虽然getter和setter使您的源代码文件更大,但在阅读代码时通常不需要关注它们。 IDE也有帮助。

  • 在运行时,将内联简单的getter和setter,以便与直接读取或编写公共属性无法区分性能。

[当您的代码可能被安全沙箱中的不受信任的代码调用时,我的关于暴露数组和集合的“故意/恶意”更改的括号内容适用。正如评论者指出的那样,private属性的状态并未被安全隐藏......除非您还可以阻止任何不受信任的代码使用反射。但是,如果您处于这种情况,我对仅返回副本的观点可能是安全关键。]

  

我有一块由瓷砖组成的板子。我已经上了Board班和Tile班。板对象由多维瓷砖阵列组成。板类中的tile的mutator是否应该通过为坐标设置两个额外的参数来设置数组或数组中的每个单独的tile?什么是更好的编程形式?

如果没有更多细节,我会说Board类应该有方法:

public void setTileAt(Tile tile, int x, int y) {...}

public Tile getTileAt(int x, int y) {...}

你可能不应该有方法:

public void setTiles(Tile[][] tiles {...}

public Tile[][] getTiles() {...}

因为他们(很可能)将Board类的内部暴露给应用程序的某些部分(理想情况下)不需要了解它们。

根据应用程序的详细信息,可能适合使用som类Point类而不是整数板坐标对(向量)。

显然,如果你试图实现一种游戏算法,需要检查大量的游戏状态以找出“最佳”动作,你可能想要以性能的名义妥协。但这种“微观优化”通常是一个坏主意。

答案 1 :(得分:1)

我做了类似的事情,发现通过两个坐标获取单个图块的访问器非常方便。 java.awt.Point类是二维数组的x,y的一个很方便的包装器。

在这种情况下,单个tile的访问器可以很好,因为你可以添加一些检查以查看x和y是否对数组有效并避免ArrayIndexOutOfBoundsException并且可能只是让它返回null。

答案 2 :(得分:0)

Getter和setter适合encapsulation。通常,您不希望盲目地为所有字段提供getter和setter,除了返回值或设置值之外什么都不做。您应该考虑要向外部公开的类状态的哪个部分,并通过实现适当的getter和setter来控制它。

制作课程immutable通常是一个好主意 - 在这种情况下,你根本就不会提供制定者,只有吸气剂。

不幸的是,使用Java中的属性很麻烦,因为Java没有任何语言支持。在其他编程语言(C#,Ruby,Scala,...)中,您可以以更优雅的方式访问属性,例如,您可以编写object.name,它将在封面调用object.getName()之下,或者你写object.name = ...,它会打电话给object.setName(...)。请参阅Uniform Access Principle

我不确切知道你的电路板类的代码是什么样的,但除非你想一次设置一整行瓷砖,否则我认为没有必要创建一个设置整个数组的setter方法。如果你只需要在某个行和列上设置一个tile,我会创建一个带有两个坐标参数的setter,让board类处理数组内的数组的复杂性。

答案 3 :(得分:0)

我不太了解游戏Hex.But我做了一个tictactoe program in java。编码有点脏,所以不要期待太多。你可以检查一下,这样你就可以得到一个一般的想法。如果您对代码或逻辑有任何疑问,可以发邮件给我:emilchacko at gmail。