This question already has answers here:
Why use getters and setters/accessors?
(39个答案)
5年前关闭。
我目前正在使用几种不同模式用Java开发一个简单的游戏。我扩展了Game类的主要内容,以将主要逻辑放入其他类中。尽管如此,主要的游戏类别仍然相当庞大。
快速浏览一下我的代码后,其中大部分是Getters和Setters(60%),而游戏逻辑确实需要其余部分。
Google的一些搜索声称Getters和Setters是邪恶的,而其他一些人则声称它们是良好的OO实践和出色程序所必需的。
所以我该怎么做?应该是哪个?我应该为私有(private)变量更改Getter和Setters,还是应该坚持使用它们?
它应该是
这也许是一个简单的例子。我要说的是,讨论 setter/getter / setter/getter 与公共(public)场所之间的关系通常会掩盖更大的问题,因为对象之间以亲密方式操纵彼此的内部状态,因此联系过于紧密。
想法是使方法直接执行您想做的事情。一个例子就是如何设置敌人的“存活”状态。您可能会想拥有一个setAlive(boolean alive)方法。相反,您应该具有:
这样做的原因是,如果更改实现,使事物不再具有“ Activity ” boolean 值,而是“命中点”值,则可以在不破坏您先前编写的两种方法的约定的情况下进行更改:
(39个答案)
5年前关闭。
我目前正在使用几种不同模式用Java开发一个简单的游戏。我扩展了Game类的主要内容,以将主要逻辑放入其他类中。尽管如此,主要的游戏类别仍然相当庞大。
快速浏览一下我的代码后,其中大部分是Getters和Setters(60%),而游戏逻辑确实需要其余部分。
Google的一些搜索声称Getters和Setters是邪恶的,而其他一些人则声称它们是良好的OO实践和出色程序所必需的。
所以我该怎么做?应该是哪个?我应该为私有(private)变量更改Getter和Setters,还是应该坚持使用它们?
最佳答案
还有一种观点认为,在大多数情况下,使用setter仍会通过允许您设置无意义的值来破坏封装。举一个非常明显的例子,如果您在游戏中拥有一个只会不断提高的得分计数器,而不是
// Game
private int score;
public void setScore(int score) { this.score = score; }
public int getScore() { return score; }
// Usage
game.setScore(game.getScore() + ENEMY_DESTROYED_SCORE);
它应该是
// Game
private int score;
public int getScore() { return score; }
public void addScore(int delta) { score += delta; }
// Usage
game.addScore(ENEMY_DESTROYED_SCORE);
这也许是一个简单的例子。我要说的是,讨论 setter/getter / setter/getter 与公共(public)场所之间的关系通常会掩盖更大的问题,因为对象之间以亲密方式操纵彼此的内部状态,因此联系过于紧密。
想法是使方法直接执行您想做的事情。一个例子就是如何设置敌人的“存活”状态。您可能会想拥有一个setAlive(boolean alive)方法。相反,您应该具有:
private boolean alive = true;
public boolean isAlive() { return alive; }
public void kill() { alive = false; }
这样做的原因是,如果更改实现,使事物不再具有“ Activity ” boolean 值,而是“命中点”值,则可以在不破坏您先前编写的两种方法的约定的情况下进行更改:
private int hp; // Set in constructor.
public boolean isAlive() { return hp > 0; } // Same method signature.
public void kill() { hp = 0; } // Same method signature.
public void damage(int damage) { hp -= damage; }
10-06 01:50