使用存取器/变异器的好处是什么?
有很多:
在getter和setter后面隐藏状态可以让您更灵活地更改类状态的内部表示,而不必破坏其他使用状态的类。
当状态被访问或改变时,getter和setter允许类做一些事情。例如,setter可以在设置、触发事件等之前进行验证。getter可以返回数组或集合属性的副本,以避免将类状态暴露于意外(或故意/恶意)更改的可能性中。
getter和setter可以同步。
如果按照“JavaBean”规则实现,则可以启用各种对象“布线”框架。
getter和setter的缺点是最小的:
任何半正方形的Java IDE都可以在两个击键中生成属性的GET/SETTER对。如果您让您的IDE生成getter和setter,它们也不会有问题。
虽然getter和setter会使源代码文件变大,但在读取代码时通常不需要注意它们。IDE也有帮助。
在运行时,简单的getter和setter将被内联,因此性能与直接读取或写入公共属性是不可区分的。
[我对公开数组和集合的“故意/恶意”更改的附加说明
只有
当安全沙盒中不受信任的代码可能调用代码时应用。正如评论者指出的那样,
private
属性未安全隐藏…除非您还可以防止任何不受信任的代码使用反射。但是,如果您处于这种情况下,我关于只返回副本的观点可能是安全关键的。]
我有一块由瓷砖组成的木板。我做了一个
Board
类和
Tile
班级。Board对象由一个多维的平铺数组组成。Board类中的tiles的mutator应该通过为坐标取两个额外参数来设置数组还是数组中的每个tile?什么是更好的编程形式?
如果没有更多的细节,我会说
董事会
类应具有方法:
public void setTileAt(Tile tile, int x, int y) {...}
public Tile getTileAt(int x, int y) {...}
你可能
不应该
有方法:
public void setTiles(Tile[][] tiles {...}
public Tile[][] getTiles() {...}
因为它们(很可能)暴露了
董事会
类到应用程序中(理想情况下)不需要了解的部分。
根据应用程序的详细信息,
可以
适合使用某种
Point
类,而不是整数板坐标对(向量)。
显然,如果你试图实现一个游戏算法,它需要检查大量的游戏状态来找出“最佳”的移动方式,那么你可能想以性能的名义进行妥协。但这种“微观优化”通常是个坏主意。