Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中有许多属性时不使用set和get方法_Java_Oop_Object_Methods - Fatal编程技术网

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

在Java中有许多属性时不使用set和get方法,java,oop,object,methods,Java,Oop,Object,Methods,所以我一直在学习OOP。我目前正在尝试用HP、法力、智力、力量、敏捷、护甲等创建简单的“英雄档案”。正如你所见,我想为英雄对象添加很多属性。但是这些属性是以私有方式声明的,而不是以公共方式声明的(因为我被告知最好将这些属性声明为私有),当我以私有方式声明它们时,我必须形成集合并获取每个属性的方法。而且它耗费了很多时间,我觉得它不实用 还有更实际的方法吗?即使有十几种get-and-set方法,编码人员真的会键入这些方法吗?我想做的就是创建两个具有这些属性的英雄档案,然后模拟这两个角色之间的1v1

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


还有更实际的方法吗?即使有十几种get-and-set方法,编码人员真的会键入这些方法吗?我想做的就是创建两个具有这些属性的英雄档案,然后模拟这两个角色之间的1v1战斗

是的,您应该编写或生成getter和setter,这要归功于您的IDE来封装字段,而且除了一个好的实践之外,当您更改变量的名称或类型(例如从集合到列表)时,您不必更改代码中的get()和set()调用,在java8中,使用lambda方法调用更有用


另外,您的类正在管理其属性,任何人都不能以非即时的方式更改它们的状态

在您的属性周围有getter和setter是非常重要的。否则,将破坏封装


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

如果您不喜欢使用getter和setter,或者您认为它们会造成混乱/它们是不必要的,那么您可以使用Lombok。也许使用外部框架不是一件初学者的事情,但它很有趣

选中此项:


@huzo,欢迎使用OOP,感谢您尝试Java。回答您的问题,对于IntelliJ使用,一旦您熟悉,请按照@Rjiuk的建议进行尝试,以避免二传手和接受者

我目前正在尝试用HP、Mana、, 智力、力量、敏捷、盔甲等等。正如你所见,有 我想向英雄对象添加很多属性

看着这些线,我可以说,这里有一个继承树。您可以为这些设置一个父类,并在其中保留公共成员(变量和方法)。父类可以是
接口
抽象类
或具体类。因此,您可以通过构造函数传递成员变量的值

事实上,假设您有
strength
类,并且您有名为
armStrength
的成员变量(作为示例)。创建此类的新实例时,可以通过构造函数传递值。但后来手臂变得虚弱/断裂。在这种情况下,您需要更新
armStrength

要实现这一点,还需要一个setter方法。在OOP中,拥有getter和setter是一件更好的事情。因为封装是面向对象编程中的一个主要问题

为了避免在有很多getter和setter时出现混乱,您可以将它们放在单独的类中

幸运的是,不用键入所有的getter和setter,您可以使用IDE快捷方式为您生成这些getter和setter

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

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

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

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

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

这是艾伦·霍卢布关于这个问题的一篇精彩文章

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

因此,与其考虑统计数据,不如考虑一下你使用这些统计数据的目的。面向对象的英雄可能是这样的:

public最终类英雄{
私人int hp;
私人综合实力;
私密性和灵活性;
私人装甲;
...
公共无效dealDamageTo(英雄其他){
其他:损伤(强度);
}
公共空间损坏(内部损坏){
hp=hp-数学最大值(0,伤害护甲);
}
...
}

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

Eclipse>right click>Source>Generate getter and setters>Check all>DoneOh我正在使用IntelliJ。那上面也有这样的特点吗@Marvin“是的,您应该编写getter和setter”,您的意思是实际手动编写或让编辑器为我们生成它们?我的意思是让编辑器编写它们,并在需要时更改它们,当然生成它们的速度更快,请使用选项并加以说明,因为“而且它占用了大量时间”这似乎是OP的主要关注点之一。谢谢!IJ为它提供了工具吗?@Huzo是的,我明白了。很有见地。谢谢!