IDEA 中的Getter和Setter报红问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IDEA 中的Getter和Setter报红问题相关的知识,希望对你有一定的参考价值。
参考技术A idea编辑器中导入新项目时,如果get、set全部报红,原因是bean中注解采用lombok来自动生成get、set、toStirng、equals等方法,而新的编辑器未安装lombok plugin。idea安装Lombok插件:点击File->Settings->plugin->直接搜素lombok插件->点击安装->重启Idea->安装完成。如下图:
ECMAScript 6 类中的 getter 和 setter 是啥?
【中文标题】ECMAScript 6 类中的 getter 和 setter 是啥?【英文标题】:What are getters and setters for in ECMAScript 6 classes?ECMAScript 6 类中的 getter 和 setter 是什么? 【发布时间】:2015-03-29 03:00:15 【问题描述】:我对 ECMAScript 6 类中 getter 和 setter 的意义感到困惑。目的是什么?以下是我所指的示例:
class Employee
constructor(name)
this._name = name;
doWork()
return `$this._name is working`;
get name()
return this._name.toUpperCase();
set name(newName)
if(newName)
this._name = newName;
【问题讨论】:
和 C# 中的类似,如果你碰巧知道的话。 相关:What is the argument for using ES6 getters and setters over getProperty/setProperty convention? 可以在以下位置找到解释这一点的好文章:coryrylan.com/blog/javascript-es6-class-syntax“在我们上面的类中,我们的 name 属性有一个 getter 和 setter。我们使用 '_' 约定来创建一个支持字段来存储我们的 name 属性。如果每次调用 get 或 set 时都没有这个,它会导致堆栈溢出“......它还谈到了变量不是真正的“私有”,但是有许多新方法可以在 JS 类中创建私有变量;我最喜欢的只是使用 Typescript,但我也使用过 Symbol 方法 【参考方案1】:ES6 中的 Getter 和 setter 与其他语言中的用途相同……包括 ES5。 ES5 已经允许通过 Object.defineProperty
使用 getter 和 setter,尽管它们不太干净且使用起来更麻烦。
实际上,getter 和 setter 允许您使用标准的属性访问表示法进行读取和写入,同时仍然能够自定义如何检索和更改属性,而无需显式的 getter 和 setter 方法。
在上面的 Employee 类中,这意味着您可以像这样访问 name
属性:
console.log(someEmployee.name);
它看起来类似于普通的属性访问,但实际上它会在返回名称之前调用toUpperCase
。同样,这样做:
someEmployee.name = null;
将访问 setter,并且不会修改内部 _name
属性,因为 name
的 setter 中引入了保护子句。
另请参阅一般问题Why use getters and setters?,了解有关为什么能够修改成员访问功能很有用的更多信息。
【讨论】:
【参考方案2】:这些setter和getter允许你直接使用属性(不使用括号)
var emp = new Employee("TruMan1");
if (emp.name)
// uses the get method in the background
emp.name = "New name"; // uses the setter in the background
这只是设置和获取属性的值。
【讨论】:
您是指属性而不是属性吗?让我有点困惑 好眼光,@Krizzu。属性存在于 JavaScript 中,与属性完全不同。答案确实是指属性而不是属性。我已经编辑了答案。我不认为回答者会介意。 :) 我不太确定这真的是一个优势,它以某种方式隐藏了使用 setter/getter 的概念。一个类的客户可能认为它直接使用属性,但它不合适,但我同意它遵守信息/细节隐藏原则。也许如果我们因此使用它,它会使使用更容易,我只需要更多地习惯它...... 你能在一个setter中传递多个参数吗?如果可以,你如何使用它? @大卫拉伯格 如果你想手动创建setter和getter,这里有一个很好的例子,来自coryrylan.com/blog/javascript-es6-class-syntax Set:set name(newName) this._name = newName;
Get: get name() return this._name.toUpperCase();
【参考方案3】:
ES6 getter 和 setter 的动机与 Java 中的类似概念截然不同。
在 Java 中,getter 和 setter 允许类定义 JavaBean。 getter 和 setter 的要点是它允许 bean 具有与公共字段所隐含的完全正交的“接口”。所以我可以有一个不是 JavaBean 属性的字段“名称”,并且我可以有一个不是字段的 JavaBean 属性“地址”。
JavaBean 属性也可以通过 Java 反射被数千个框架(例如 Hibernate)“发现”。因此,getter 和 setter 是“公开” bean 属性的标准方法的一部分。
Getter 和 setter 作为函数,也具有它们“抽象”实现的价值。它可以是字段或计算(“合成”)值。因此,如果我有一个名为“zipcode”的 bean 属性,它以存储的字符串开头。现在假设我想将其更改为从地址/城市/州计算的值?
如果我使用一个字段,这段代码会中断:
String zipcode = address.zipcode();
但如果我使用吸气剂,这不会中断:
String zipcode = address.getZipcode();
JavaScript 没有像 JavaBeans 这样的东西。据我所知,GET 和 SET 的预期值仅限于上述“合成”(计算)属性。
但它比 java 好一点,虽然 Java 不允许您将“字段”兼容地转换为方法,但 ES6 GET 和 SET 允许这样做。
也就是说,如果我有:
var zipcode = address.zipcode;
如果我将 zipcode 从标准对象属性更改为 getter,上面的代码现在调用 GET 函数。
请注意,如果我没有在定义中包含 GET,这将不会调用 zipcode GET 方法。相反,它只会将函数 zipcode 分配给 var。
所以我认为这些是理解 Java 和 JavaScript ES6 getter 和 setter 之间的一些重要区别。
【讨论】:
【参考方案4】:class Employee
constructor(name)
this._name = name;
doWork()
return `$this._name is working`;
get name()
// when you get this by employeeInstance.name
// the code below will be triggered
// and you can do some logic here
// just like `console.log` something you want
console.log('get triggered!')
return this._name.toUpperCase();
set name(newName)
// the same as `get`
// when you employeeInstance.mame = 'xxx'
// the code below will be trigged
// and you can also do some logic
// like here is a `console.log` and `if check`
console.log('set triggered!')
if (newName)
this._name = newName;
const employeeInstance = new Employee('mike')
employeeInstance.name
employeeInstance.name = '' // this won't be successful, because the `if check`
console.log(employeeInstance.name)
// =>
// get triggered
// set triggered
// get triggered
// MIKE
无论如何getter
和setter
就像一个间谍。它监视对象的属性,因此您可以在每次获取或设置属性值时执行一些操作。
【讨论】:
以上是关于IDEA 中的Getter和Setter报红问题的主要内容,如果未能解决你的问题,请参考以下文章
java的idea快捷键生成getter和setter有构造参数无构造参数重写toString方法
IDEA设置生成带注释的getter和setter解决方案 (图文教程)
Intellij IDEA 自定义 getter and setter
Intellij IDEA中lombok包setter / getter方法失效
Idea插件之Lombok简化实体类setter/getter操作
终极方法解决IDEA搜索不到Lombok插件的问题(IDEA 不能识别 @Slf4j,@Getter ,@Setter注解)