繁体   English   中英

当有许多属性时,不使用Java中的set和get方法

[英]Not using set and get methods in Java when there are many attributes

所以我一直在学习OOP。 我目前正在尝试使用HP,Mana,智能,力量,敏捷,装甲等创建简单的“英雄配置文件”。正如您所看到的,我想要添加到Hero对象中的属性很多。 但是这些属性是私有的而不是公开的(因为我被告知最好将这些属性声明为私有),当我私下声明它们时,我必须为每个属性创建set和get方法。 它消耗了很多时间,我觉得它不实用。

有更实用的方法吗? 编码员是否真的键入了这些get和set方法,即使它们有十几种? 我想做的就是用这些属性创建两个Hero Profiles,然后模拟两者之间的1v1战斗。

在你的房产周围设置getters和setter非常重要。 否则,你打破了封装。

不幸的是,Java没有为程序员提供合适的快捷方式来声明getter和setter。 但是,许多IDE确实为您提供了生成访问器方法的工具。

无论谁告诉你,对象的个别属性应该是私有的绝对正确

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

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

不幸的是,访问器方法是Java中常见的习惯用法(也是C#),但如果你认真学习OOP,你应该不惜一切代价避免使用它们! 之后,当你有更多的经验时,你可能会在少数情况下做出例外,但我会敦促你暂时避免它们。 避免使用Project Lombok并避免IDE功能自动生成内容。

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

回到你的实际问题:是的,你声明你的字段是私有的,但你根本没有为它们定义setter / getters。 我们所做的是考虑对象应具有的职责/特征/功能/逻辑。

因此,而不是思考的统计,想想你正在使用这些统计信息是什么 面向对象的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);
    }
    ...
}

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

是的,你应该编写或生成getter和setter,这要归功于你的IDE封装了你的字段,而不是一个好的做法,当你改变变量的名字时,你不必更改代码中的get()和set()调用,或类型(例如,从Collection到List),并且在java8中使用lambda方法调用更有用

此外,你的班级正在管理其属性,没有人能够以不方便的方式改变他们的状态

如果你不想制造吸气剂和制定者,或者你认为它们造成混乱/它们是不必要的,你可以使用龙目岛。 也许使用外部框架并不是一个初学者的事情,但它很有趣。

https://projectlombok.org/

检查一下:

https://projectlombok.org/features/GetterSetter.html

https://projectlombok.org/features/Data.html

@huzo,欢迎来到OOP,感谢您尝试使用Java。 回答你的问题,对于IntelliJ使用https://www.jetbrains.com/help/idea/2017.1/generating-getters-and-setters.html ,一旦熟悉, 按照建议尝试https://projectlombok.org/由@Rjiuk来避免制定者和吸气者。

我目前正在尝试使用HP,Mana,智能,力量,敏捷,装甲等创建简单的“英雄配置文件”。正如您所看到的,我想要添加到Hero对象中的属性很多。

看看这些我可以说,这里有继承树。 您可以为这些创建父类,并在其中保留常用成员(变量和方法)。 父类可以是interfaceabstract class或具体类。 那么你可以通过构造函数传递成员变量的值。

事实上,你认为你有strength等级,并且你有一个名为armStrength成员变量(作为例子)。 当您创建此类的新实例时,您可以通过构造函数传递值。 但后来手臂变得虚弱/破碎。 在这种情况下,您需要更新armStrength

要实现这一点,您还需要一个setter方法。 拥有getter和setter在OOP中更好。 因为封装是OOP中的一个主要观点。

为了避免在拥有大量的getter和setter时出现混淆,你可以将它们保存在一个单独的类中。

幸运的是,您可以使用IDE快捷方式为您设置所有getter和setter,而不是键入所有getter和setter。

  • 在Eclipse中: Alt+Shift+S, R
  • 在Netbeans中: Alt+Insert
  • 在IntelliJ中: ALT+Insert

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM