吸气剂和定型剂设计不佳吗? 看到矛盾的建议
这个问题在这里已经有了答案:
还有一种观点认为,大多数时候,使用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);
这可能是一个简单的例子。 我想说的是,讨论getter / setters与公共领域往往会掩盖更大的问题,即物体以亲密的方式操纵彼此的内部状态,因此过于紧密地耦合。
这个想法是让方法直接做你想做的事情。 一个例子就是如何设置敌人的“活着”状态。 你可能想要有一个setAlive(boolean alive)方法。 相反,你应该有:
private boolean alive = true;
public boolean isAlive() { return alive; }
public void kill() { alive = false; }
原因是如果你改变了实现不再有“活着”布尔值而是“生命值”的值,你可以改变这种情况而不会破坏你之前编写的两种方法的契约:
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; }
这真的取决于情况 - 有时你真的只是想要一个愚蠢的数据对象。
你已经有了很多很好的答案,所以我只给我两分钱。 吸气剂和吸附剂是非常非常邪恶的。 他们基本上让你假装隐藏你的对象的内部,当你所做的大部分时间都被抛弃在冗余代码中,这些代码不会隐藏内部状态。 对于一个简单的POJO,没有理由不能用obj.name =“Tom”替换getName()和setName()。
如果方法调用仅仅取代赋值,那么通过首选方法调用获得的所有内容都是代码膨胀。 不幸的是,该语言已经在JavaBeans规范中规定了使用getter和setter,所以Java程序员被迫使用它们,即使这样做没有任何意义。
幸运的是,Eclipse(以及其他可能的IDE)可以让你自动生成它们。 对于一个有趣的项目,我曾经在XSLT中为它们构建了一个代码生成器。 但是如果我在Java中摆脱了一件事情,那就是过分依赖getter和setter。
链接地址: http://www.djcxy.com/p/53943.html上一篇: Are getters and setters poor design? Contradictory advice seen