首页
学习
活动
专区
圈层
工具
发布

为什么要用Getter和Setter方法,而不是公开属性

当我在Java语言编程中开始我的职业生涯时,我就对Getter和Setter感到困惑。为什么要这么写呢?为什么不直接用Public呢?这对我来说是个奇怪的语法。 ?...设置值的惟一方法是通过Setter,通过Getter获得值,所以现在字段只有一个入口和一个出口点,因为Getter和Setter是允许代码块的方法,所以可以对它们进行验证检查!...这同样适用于Getter方法——您可以决定返回实际的引用或克隆它,并将其返回给调用者。 因此,Getter和Setter起到保险丝或断路器的作用,电流必须通过保险丝。...我理解,但一般来说,我们不写任何东西在Getter和Setter。我们只返回并设置字段,就像公开字段一样。那你为什么要说这些?...但是,当一个字段没有这样的验证约束时,为什么要麻烦写一个Getter和Setter?我可以简单地公开它。 根据我的理解,问题的症结在于避免使代码变得不必要的复杂。

2.4K10

vue源码分析-基础的数据代理检测

2.1 数据代理的含义数据代理的另一个说法是数据劫持,当我们在访问或者修改对象的某个属性时,数据劫持可以拦截这个行为并进行额外的操作或者修改返回的结果。...有了Object.defineProperty方法,我们可以方便的利用存取描述符中的getter/setter来进行数据的监听,这也是响应式构建的雏形。...getter方法可以让我们在访问数据时做额外的操作处理,setter方法使得我们可以在数据更新时修改返回的结果。...看看下面的例子,由于设置了数据代理,当我们访问对象o的a属性时,会触发getter执行钩子函数,当修改a属性的值时,会触发setter钩子函数去修改返回的结果。...,而Proxy 支持的拦截操作有13种之多,具体可以参照ES6-Proxy文档,前面提到,Object.defineProperty的getter和setter方法并不适合监听拦截数组的变化,那么新引入的

1K00
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    vue源码分析-基础的数据代理检测_2023-03-01

    这是我们这节分析的重点。 2.1 数据代理的含义 数据代理的另一个说法是数据劫持,当我们在访问或者修改对象的某个属性时,数据劫持可以拦截这个行为并进行额外的操作或者修改返回的结果。...有了Object.defineProperty方法,我们可以方便的利用存取描述符中的getter/setter来进行数据的监听,这也是响应式构建的雏形。...getter方法可以让我们在访问数据时做额外的操作处理,setter方法使得我们可以在数据更新时修改返回的结果。...看看下面的例子,由于设置了数据代理,当我们访问对象o的a属性时,会触发getter执行钩子函数,当修改a属性的值时,会触发setter钩子函数去修改返回的结果。...,而Proxy 支持的拦截操作有13种之多,具体可以参照ES6-Proxy文档,前面提到,Object.defineProperty的getter和setter方法并不适合监听拦截数组的变化,那么新引入的

    97530

    Vue3 源码解析(八):ref 与 computed 原理揭秘

    当我们通过 ref.value 的形式读取该 ref 的值时,就会触发 value 的 getter 方法,在 getter 中会先通过 track 收集该 ref 对象的 value 的依赖,收集完毕后返回该..._dirty) { // getter 时执行副作用函数,派发更新,这样能更新依赖的值 self._value = this.effect() self...._setter(newValue) } 在 computed 中,通过 getter 函数获取值时,会先执行副作用函数,并将副作用函数的返回值赋值给 _value,并将 _dirty 的值赋值给 false...总结 在本文中,以上文副作用函数和依赖收集派发更新的知识点为基础,笔者为大家讲解了 ref 和 computed 两个在 Vue3 响应式中最常用的 api 的实现,这两个 api 都是在创建时返回了一个类实例...当我们在学会使用这些的同时,并能知其所以然一定能够帮我们在使用这些 api 时发挥出它最大的作用,同时也能够让你在写出了一些不符合你预期代码的时候,快速的定位问题,能搞定究竟是自己写的不对,还是本身 api

    2.2K40

    我要狠狠的反驳“公司禁止使用Lombok”的观点

    JDK 版本问题 当我想要将现有项目的 JDK 从 Java 8 升级到 Java 11 时,我发现 Lombok 不能正常工作了。...于是我不得不将所有的 Lombok 注解从项目源代码中清除,并使用 IDE 自带的功能生成 getter/setter,equals,hashCode,toString 以及构造器等方法,你也可以使用...你要看JavaBean中的方法?它有啥好看的,Getter和Setter方法有啥好看的,你不知道Getter和Setter方法长什么样吗?实在不明白有什么好看的?...我的反驳:我们在使用其它框架时,那框架引入了不计其数的包,现在要引入一个很小的包都在斤斤计较,Lombok这么好用,几乎所有项目都会使用到,这还需要强制引入吗,我们自觉的都会在maven的parent依赖中统一引入了...一般公司都没有这么激进吧,现在Kotlin很多配套东西在企业中使用还不成熟吧。 大家还有什么不同观点可以互相讨论。 PS:如果觉得我的分享不错,欢迎大家随手点赞、在看。

    88330

    Objective C (iOS) for Qt C++ Developers(iOS开发,Qt开发人员需要了解什么?)

    理解这篇博客的内容,我将描写叙述诸多我所学到的东西.这将很多其它的是大脑转存而不是单一的教程 ,所以我仍然希望这将对你非常有帮助,我将首先写编程语言的差异,然后再写关于类库的差异 1...您能够创建一个属性@property和编译器使用@synthesize为你做一个getter / setter。...当然也能够定制getter / setter实现很多其它的内部逻辑,比如实现延迟初始化。 你能想象Objective C托付作为一组插槽。...托付对象的一个托付方法被对象调用通知某些事情已经发生。这很类似于Java的接口 2.与Qt相关类相类似的东西 与语法一样重要是相关的库所提供的iOS(和OS X)。...Misc 当我开发Qt,我使用QtCreator,我的联合创始人奥利弗是KDevelop的粉丝,他也应该非常喜欢QtCreator,对于iOS开发,您能够使用苹果免费的XCode开发工具。

    1.2K10

    我要狠狠反驳“公司禁止使用Lombok”的观点!

    JDK 版本问题 当我想要将现有项目的 JDK 从 Java 8 升级到 Java 11 时,我发现 Lombok 不能正常工作了。...于是我不得不将所有的 Lombok 注解从项目源代码中清除,并使用 IDE 自带的功能生成 getter/setter,equals,hashCode,toString 以及构造器等方法,你也可以使用...你要看JavaBean中的方法?它有啥好看的,Getter和Setter方法有啥好看的,你不知道Getter和Setter方法长什么样吗?实在不明白有什么好看的?...我的反驳:我们在使用其它框架时,那框架引入了不计其数的包,现在要引入一个很小的包都在斤斤计较,Lombok这么好用,几乎所有项目都会使用到,这还需要强制引入吗,我们自觉的都会在maven的parent依赖中统一引入了...加上臃肿的Getter&Setter你却嫌弃臃肿,不加你又说破坏代码的完整性,你想怎么做。增加团队的技术债务?学个Lombok十分钟的事情,有什么好增加的。要使用Kotlin?

    74330

    Python不是Java (zt)

    这并不是一个性能上的问题,但是一个Python程序员要用像这些类似Java习惯的代码的话,可能就会被在该输入Foo.someFunction时却要输入Foo.Foo.someMethod这种情况给惹毛了...或者,如果你脸皮厚的话,试试向一个Lisp程序解释你的程序为什么要用XML!) * Getter和Setter是坏蛋!坏蛋!魔鬼! Python对象不是Java Bean。...不要写什么getter和setter,然后还把它们包装在“属性”里面。它直到你能证明你需要比一个简单访问复杂一点的功能时才有意义,否则,不要写getter和setter。...在Java中,你必须使用getter和setter因为公共字段不允许你以后改变想法再去使用getter和setter。...在Python中,这样做很傻,因为你可以以一个普通特性开始并可以在任何时间改变你的想法,而不用影响到这个类的任何客户。所以不要写getter和setter。

    52010

    对比java和python

    由此可以看出,java不管在GNU还是商业领域都是应用最广的语言。C主要用于构建系统底层。c++和java用于构建中间应用层。...或者,如果你脸皮厚而且不介意被人嘲笑的话,试试向一个Lisp程序解释你的程序为什么要用XML!) ◆Getter和setter是恶魔。我应该说它是恶魔,是魔鬼!...不要写什么getter和setter,而是还把它们内置在“属性”里面。它直到你能证明你需要比一个简单访问复杂一点的功能时才有意义,要不然,不要写getter和setter。...在Java中,你必须使用getter和setter,因为公共字段不允许你以后改变想法再去使用getter和setter。...所以不要写getter和setter方法。 ◆代码重复在Java中通常来说就是一场不可避免的灾祸,你必须经常反复地写同一个方法而只有一点点的变化(通常是这是因为静态类型约束)。

    1.5K40

    我要狠狠的反驳“公司禁止使用Lombok”的观点

    JDK 版本问题 当我想要将现有项目的 JDK 从 Java 8 升级到 Java 11 时,我发现 Lombok 不能正常工作了。...于是我不得不将所有的 Lombok 注解从项目源代码中清除,并使用 IDE 自带的功能生成 getter/setter,equals,hashCode,toString 以及构造器等方法,你也可以使用...你要看JavaBean中的方法?它有啥好看的,Getter和Setter方法有啥好看的,你不知道Getter和Setter方法长什么样吗?实在不明白有什么好看的?...我的反驳:我们在使用其它框架时,那框架引入了不计其数的包,现在要引入一个很小的包都在斤斤计较,Lombok这么好用,几乎所有项目都会使用到,这还需要强制引入吗,我们自觉的都会在maven的parent依赖中统一引入了...加上臃肿的Getter&Setter你却嫌弃臃肿,不加你又说破坏代码的完整性,你想怎么做。增加团队的技术债务?学个Lombok十分钟的事情,有什么好增加的。要使用Kotlin?

    53670

    Android—Room数据库(介绍)

    前言 Google终于发布了一个和SQLite相关的库了???。之前一直都是在SQLite、XUtils、greenDao、Realm这些数据库之间来回折腾。现在终于有一个更“正统”数据库了。...前面我也说到了现在也有不少开源的数据库给大家使用,那为什么我们还要去学习使用这个库呢?当然不是我前面说的“正不正统”的原因了。...因为Room有下面几个优点: ① SQL查询在编译时就会验证 - 在编译时检查每个@Query和@Entity等,这就意味着没有任何运行时错误的风险可能会导致应用程序崩溃(并且它不仅检查语法问题,还会检查是否有该表.../setter方法是必须的 //这里的getter/setter方法是必须的 //这里的getter/setter方法是必须的 //重要的事说三遍 } 这里需要使用@Entity来注解该类...DB_NAME).build(); } public abstract UserDao getUserDao(); } 这里使用@Database注解该类并添加了表名、数据库版本(每当我们改变数据库中的内容时它都会增加

    1.3K50

    通过简单小示例搞明白vue双向数据绑定核心原理

    vue2 中利用的 Object.defineProperty 去劫持对象属性的 getter 和 setter,所以 data 函数里需要返回一个对象,如果没有在 data 里定义的属性是不会双向绑定的...双向数据绑定还用到了设计模式中的发布/订阅模式,当触发 getter 的时候去做依赖收集,触发 setter 时去通知执行收集的对应依赖回调。...而 set 里直接通过修改 value 的值就能改变 person 的 age 属性值,是因为我们用到了一个外部的 value 变量,set 里直接修改 value 的值,当要去值时 get 里其实就是返回的这个...,我们需要提前收集起来,当真的发生变动时,才有东西拿出来执行。...其实到这里你也就基本能明白 vue 的双向数据绑定实现原理和步骤了:getter 里自动收集依赖到一个盒子里,setter 里再拿出收集的对应依赖遍历执行,核心不就是发布/订阅模式。

    44351

    通过简单小示例彻底搞明白vue双向数据绑定核心原理

    vue2 中利用的 Object.defineProperty 去劫持对象属性的 getter 和 setter,所以 data 函数里需要返回一个对象,如果没有在 data 里定义的属性是不会双向绑定的...双向数据绑定还用到了设计模式中的发布/订阅模式,当触发 getter 的时候去做依赖收集,触发 setter 时去通知执行收集的对应依赖回调。...而 set 里直接通过修改 value 的值就能改变 person 的 age 属性值,是因为我们用到了一个外部的 value 变量,set 里直接修改 value 的值,当要去值时 get 里其实就是返回的这个...当数据变动时要做的所有操作,我们需要提前收集起来,当真的发生变动时,才有东西拿出来执行。...其实到这里你也就基本能明白 vue 的双向数据绑定实现原理和步骤了:getter 里自动收集依赖到一个盒子里,setter 里再拿出收集的对应依赖遍历执行,核心不就是发布/订阅模式。

    26240

    吐血推荐珍藏的IDEA插件

    作为Java程序员,你还在为不断的写Getter/Setter方法而苦恼吗?你还在为每个Model类都要写类似的构造方法而感到烦恼吗?...赶快试试Lombok吧,它可以有效帮助你解决这些问题,只需要一个注解,构造方法和Getter/Setter方法全部搞定,再也不用把时间浪费在无用功上了。...Rainbow Brackets GsonFormat 我们在接外部接口时,别人给了一串JSON串,我们在代码中需要将JSON中的字段封装到一个类中,一个一个输入挺麻烦的,这时GsonFormat就可以派上用场了...GsonFormat Maven Helper 如果你的项目使用的构建工具是Maven的话,这个插件就能帮你避免各种依赖冲突,安装好插件之后,打开pom文件,可以看到最下方有一个叫Dependency...以上这些就是我常用的IDEA插件了,没有太多花里胡哨的东西,大家如果有什么好用的插件也欢迎分享出来。

    1.5K10

    40款帮助你加薪的IDEA神器插件!

    例如开发中经常需要写的javabean,都需要花时间去添加相应的getter/setter, 也许还要去写构造器、equals 等方法,而且需要维护,当属性多时会出现大量的getter/setter方法...Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。...r的所有特性)不够精细,可以使用@Getter/@Setter注解,此注解在属性上,可以为相应的属性自动生成Getter/Setter方法,示例如下: @NonNull : + 该注解用在属性或构造器上...特别是在和其他系统对接时,往往以JSON格式传输数据,而我们需要用Java实体接收数据入库或者包装转发,如果字段太多一个一个编写那就太麻烦了。 快捷键:Alt+ S 22....) test:增加测试或者修改测试 build: 影响构建系统或外部依赖项的更改(maven,gradle,npm 等等) ci: 对CI配置文件和脚本的更改 chore:对非 src 和 test 目录的修改

    1K51
    领券