gpt4 book ai didi

java - 当有很多属性时,不在 Java 中使用 set 和 get 方法

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:06:39 24 4
gpt4 key购买 nike

所以我一直在学习OOP。我目前正在尝试使用 HP、法力、智力、力量、敏捷、护甲等创建简单的“英雄配置文件”。如您所见,我想为英雄对象添加很多属性。但是这些属性是在私有(private)而不是公共(public)中声明的(因为我被告知最好将这些声明为私有(private)的)并且当我在私有(private)中声明它们时我必须为这些属性中的每一个形成设置和获取方法。而且很费时间,感觉不太实用。

有没有更实用的方法?编码人员是否真的键入了这些 get 和 set 方法,即使它们有很多?我只想创建两个具有这些属性的英雄文件,然后模拟两者之间的 1v1 战斗。

最佳答案

无论是谁告诉您,对象的各个属性都应该是私有(private)的,这绝对正确!

OOP 的基本原则之一是 Encapsulation .简而言之,这意味着对象的内部结构(“字段”)应该被隐藏。这是 OOP 最重要的方面,OOP 的大部分优势都来自于此。

现在,访问器方法(setter 和getter)违反封装,就像公开它们一样,因为您不再隐藏内部结构。这不仅仅是关于保护内部字段,而是关于隐藏它们。

不幸的是,访问器方法是 Java(和 C#)中的常见习语,但如果您认真学习 OOP,则应不惜一切代价避免使用它们!以后,当你有更多的经验时,你可能会在一些情况下破例,但我劝你暂时不要使用它们。避免使用 Project Lombok 并避免使用 IDE 功能来自动生成内容。

Here是 Allen Holub 关于这个主题的精彩文章。

回到您的实际问题:是的,您将字段声明为私有(private),但您根本没有为它们定义 setter/getter。相反,我们所做的是考虑对象应该具有的职责/特性/功能/逻辑。

因此,与其考虑统计数据,不如考虑您将这些统计数据用于什么目的。一个面向对象的 Hero 可能看起来像这样:

public final class Hero {
private int hp;
private int strength;
private int agility;
private int armor;
...

public void dealDamageTo(Hero other) {
other.takeDamage(stength);
}

public void takeDamage(int damage) {
hp = hp - Math.max(0, damage-armor);
}
...
}

当然,这只是一个示例,但您可能明白其中的要点。如果您的设计是正确的,则根本不需要发布内部字段。

关于java - 当有很多属性时,不在 Java 中使用 set 和 get 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44219954/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com