首页 > Java > java教程 > 在面向对象编程中什么时候应该避免使用 Getter 和 Setter?

在面向对象编程中什么时候应该避免使用 Getter 和 Setter?

Susan Sarandon
发布: 2024-12-12 18:55:09
原创
868 人浏览过

When Should You Avoid Getters and Setters in Object-Oriented Programming?

获取器和设置器:智慧设计

在软件工程中,获取器和设置器分别充当私有变量的访问器和修饰符。虽然它们对于良好的面向对象编程实践至关重要,但关于它们潜在的设计缺陷一直存在争议。

一个常见的批评是 getter 和 setter 会造成不必要的封装破坏,从而暴露内部变量以进行操作。考虑以下代码片段:

private int score;

public int getScore() { return score; }

public void setScore(int score) { this.score = score; }
登录后复制

getScore() 方法允许直接访问私有分数变量,而 setScore() 允许任意值分配。这可能会导致不一致或无效的状态更改,如下面的代码所示:

// Attempt to increment score by destroying an enemy
game.setScore(game.getScore() + ENEMY_DESTROYED_SCORE);
登录后复制

如果分数只能增加,而不是任意设置,那么这种方法很容易出错。更合适的设计是创建一个专门的方法来封装分数递增操作:

public void addScore(int delta) { score += delta; }
登录后复制

通过限制setter并引入替代的分数操作方法,这种设计确保了数据一致性并防止无效的状态转换.

此外,getter 和 setter 可能会导致对象之间的紧密耦合。考虑以下示例,其中对象的“活动”状态是通过 setter 和 getter 方法控制的:

private boolean alive = true;

public boolean isAlive() { return alive; }

public void setAlive(boolean alive) { this.alive = alive; }
登录后复制

如果此逻辑的实现将来发生变化,则 getter 和 setter 签名将保持不变以维护兼容性。但是,这可能会导致底层数据结构(例如,表示“活动”状态的布尔值)不再准确反映对象的状态。

为了解决这些设计问题,建议创建方法直接执行所需的操作,而不是仅仅依赖 getter 和 setter。例如,“存活”状态可以通过专用方法来处理:

private int hp; // Hit points 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; }
登录后复制

这种方法封装了操作对象存活状态的逻辑,并为其他对象与其交互提供了清晰简洁的接口.

总之,虽然 getter 和 setter 在某些情况下可能很有用,但了解它们潜在的设计缺陷很重要。通过采用优先考虑数据一致性、对象封装和松散耦合的替代设计模式,开发人员可以创建从长远来看更加健壮和可维护的软件。

以上是在面向对象编程中什么时候应该避免使用 Getter 和 Setter?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板