還有一種觀點認為,大多數(shù)情況下,使用setters仍然可以通過設置毫無意義的值來破壞封裝。作為一個很明顯的例子,如果你在游戲中有一個得分計數(shù)器,它只會上升,而不是
// Gameprivate int score;public void setScore(int score) { this.score = score; }public int getScore() { return score; }
// Usagegame.setScore(game.getScore() + ENEMY_DESTROYED_SCORE);
應該是
// Gameprivate int score;public int getScore() { return score; }public void addScore(int delta) { score += delta; }
// Usagegame.addScore(ENEMY_DESTROYED_SCORE);
這也許是一個簡單的例子。我想說的是,討論getter/setters與公共字段通常會掩蓋更大的問題,對象以一種親密的方式操縱彼此的內部狀態(tài),因此過于緊密地耦合在一起。
這樣做的目的是讓那些直接做你想做的事情的方法。一個例子就是如何設置敵人的“活著”地位。您可能會有一個setAlive(布爾活動)方法。相反,你應該:
private boolean alive = true;public boolean isAlive() { return alive; }public void kill() { alive = false; }
這樣做的原因是,如果您更改的實現(xiàn)不再具有“活動”布爾值,而是具有“命中點”值,則可以在不破壞前面編寫的兩種方法的約定的情況下對其進行更改:
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; }