当前位置: 首页 > 面试题库 >

Java Are getters and setters poor design?自相矛盾

闻人嘉木
2023-03-14
问题内容

我目前正在使用几种不同模式用Java开发一个简单的游戏。我扩展了Game类的主要内容,以将主要逻辑放入其他类中。尽管如此,主要的游戏类别仍然相当庞大。

快速浏览一下我的代码后,其中大部分是Getters和Setters(60%),而游戏逻辑真正需要的其余部分则是Getters和Setters。

Google的一些搜索声称Getters和Setters是邪恶的,而其他一些人则声称它们是良好的OO实践和出色程序所必需的。

所以我该怎么做?应该是哪个?我应该更改私有变量的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);

这也许是一个简单的例子。我要说的是,讨论吸气剂/吸气剂与公共场所之间的关系通常会掩盖更大的问题,因为对象以一种亲密的方式操纵彼此的内部状态,因此过于紧密。

这个想法是使方法可以直接做你想做的事情。一个例子就是如何设置敌人的“存活”状态。你可能会想拥有一个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; }


 类似资料:
  • 请查看Oracle规范-第5章。 这一行: 拓宽的基元转换不会丢失有关数值的整体大小的信息。 接下来,就在下面两行,这一行说震级信息可能会丢失。 从float到double的非strictfp加宽原语转换可能会丢失有关转换值的总体大小的信息。 这似乎是一个明显的矛盾;这是一个错误吗?

  • 我正在学习C语言的课程。我从标准中看到了以下语句: 在重载解析期间,类X的非静态cv限定成员函数被视为一个函数,如果它没有ref限定符或具有左值ref限定符,则该函数将左值引用类型的隐式参数带到cv限定X。否则(如果它有rvalue ref限定符),它将被视为一个函数,将rvalue reference类型的隐式参数作为cv限定的X。 上述语句似乎暗示,对于类的限定非静态成员函数,类的限定非静态成

  • 我正在用声纳和龙目岛工作,这两个人似乎不是朋友。 上面的示例为类中的每个字段生成了一个getter方法,这要感谢@getter注释,但是sonar警告我这些字段是“单数字段”,它们只在一个方法中使用,但由于生成的getter方法,情况并非如此。 很明显,声纳并没有考虑龙目山。我的问题是,是否有可能使这些警告消失,例如使用注释?

  • 对于类为Thread的shutdown钩子是在调用shutdown的线程上运行其可运行代码,还是在其自身上运行,存在一些冲突。 将作为参数。这意味着线程将启动并在自己身上运行其方法。这也与的留档一致: 公共void addShutdownHook(线程挂钩) 注册新的虚拟机关闭挂钩。Java虚拟机关闭以响应两种事件: 当最后一个非守护进程线程退出或调用exit(相当于System.exit)方法时

  • 抱歉,如果这是重复的,我没有发现类似的问题,也许我错过了什么。。。 我将举例说明我想要什么: > 假设我们有一个用于检查电子邮件的简单正则表达式 私有静态最终字符串EMAIL_PATTERN = "^[_A-Za-z0-9-\\](\\.[_A-Za-z0-9-] )*@[A-Za-z0-9-](\\.[A-Za-z0-9])*(\\.[A-Za-z]{2,})$"; 我开始一个符号一个符号地输入

  • 问题内容: 我将开始学习JSF,但是首先我想了解它作为MVC框架的概况。 有很多答案,其中有很多赞扬解释了JSF中的MVC层,但是它们通常是矛盾的。 BalusC的答案: JSFMVC框架中的MVC是什么组件? 在总体架构图中,您自己的JSF代码是 V : M- 业务域/服务层(例如EJB / JPA / DAO) V- 您的JSF代码 C -FacesServlet 在开发人员图中,体系结构 V