1
wwqgtxx 2017-06-04 20:23:48 +08:00 via iPhone
能问出这个问题就能充分体现出你根本没有弄懂 getter 和 setter 存在的必要性
|
2
cwek 2017-06-04 20:34:23 +08:00
同不知道 getter,setter 的重要性
不过 Java 有 IDE 自动生成的话,这个算是 IDE 的糖? |
3
yuhuan66666 2017-06-04 20:42:52 +08:00 via Android
同不懂,求大神解释
|
4
muziling OP @wwqgtxx #1
没理解,如果要说是用来保护成员变量,这个例子 Kotlin 也是完全放开读写的。 如果要说 set 来做自己的逻辑,比如 public void setSpeed(int speed) { if ( speed > 100 ) { this.speed = 100; } else { this.speed = speed; } } 那其实 Kotlin 也需要写这段代码 public classs XXX{ set(value){ field = if (speed > 100) 100 else speed; } } |
5
xupefei 2017-06-04 20:51:14 +08:00
|
6
xupefei 2017-06-04 20:55:09 +08:00
@xupefei 说白了还是 C# 好,可以直接写
public string XXX { ....get=>_xxx; ....set { ........_xxx=value; ........DoSomething(); ....} } |
7
sagaxu 2017-06-04 21:02:38 +08:00 9
你没 get 到
https://kotlinlang.org/docs/reference/properties.html Java 定义成了 public,就绕过 getter/setter 了,如果有 100 个地方写了 foo.bar = xxx,你把 field 改成 private 再加上 getter/setter 的时候,已经晚了,你要 100 个地方一个个改过来,如果你发布的是个库,所有使用这个库的代码都要一一改过来。 Kotlin 的 property,你写 foo.bar=xxx 的时候,它会检查有没有 setter,有 setter 就会调用 setter,没有就直接赋值。因为 property 定义的时候,是可以有可选的 getter/setter 的。当你给一个 property 增加 setter 的时候,调用它的地方,是不需要修改代码的。C#或者 Python 都有这样的特性,只有万年不变的 Java 一直原地踏步。 |
8
searene 2017-06-04 21:04:50 +08:00
据我所见,很多情况下 class 里面的 getter 和 setter 都只有一行代码,跟直接把字段暴露为 public 没有什么区别,但很多人还是习惯直接生成 getter 和 setter。
|
9
hyperdak288 2017-06-04 21:10:27 +08:00
话说这个特性不是 groovy 早就有了么,为什么也能吹一波?
|
10
Sharuru 2017-06-04 21:20:07 +08:00 1
Lombok 多好用……管那么多
Kotlin 这种四不像语言…… 嘛,黑 Java 反正 P.C. |
11
geelaw 2017-06-04 21:23:55 +08:00 via Android
原因里面最显然的一个:get/set 可以 override,一个公有字段不能。
再举一个例子:并不是所有的属性都有一个成员和它对应,例如一个代表 Windows 窗口的类,它的成员可能只有一个 handle,设置、获取窗口标题是通过 API 完成的。 |
12
royzxq 2017-06-04 22:58:01 +08:00
js 瑟瑟发抖
|
14
linux40 2017-06-05 09:29:57 +08:00 via Android
其实也就长得不一样,其它没区别。
|
15
bk201 2017-06-05 09:30:03 +08:00 via iPhone
那应该问为什么用 private
|
16
silva 2017-06-05 10:13:55 +08:00
@sagaxu 如你所说的话,我觉得这是个很蠢的特性呢?
同样是看到一句 aa.b = xx 的赋值语句,我需要看上下文才知道这是一句直接的赋值还是调用了 setter 函数。 这类看似简便,实则引入混乱的语法糖最让人讨厌了 |
17
af463419014 2017-06-05 10:45:58 +08:00
|
18
mooncakejs 2017-06-05 11:49:30 +08:00
@af463419014 setter 如果作为方法调用其实影响最大的是链式操作
a.xx = b.yy = c.zz = value 如果是 setter 就要 a.setXX(value) b.setYY(value) |
19
sagaxu 2017-06-05 12:07:46 +08:00
@silva 你不需要看上下文,你可以当作它就是调用了 setter,赋值只是它的优化,优化时省略了自动合成的 setter 而已。即便是 Java 写了 setter,你不看代码,仍然不知道它是不是只做了赋值,还是做了别的事情。你创建的对象,JVM 也会做优化,有的在堆上,有的在栈上,通过逃逸分析和 JIT 等优化手段,它有很多种可能性,你在 Java 里写的 getter/setter,JVM 仍然存在帮你把方法调用优化掉的可能性,所以你关心是真的赋值还是 set 方法,毫无意义。
@af463419014 不熟悉 kotlin,熟悉 Python 或者 C#也行,即便 JS 也有这个功能,property 是很多现代语言的共性,并不会增加多少理解上的困难。Kotlin property 能做的事情远非 getter/setter 这么简单,它还能很方便的实现 lazy 求值。事实上很多 Javaer 已经开始用 Lombok 去自动合成 getter/setter,IDE 的确能比手写省事不少,但是一个 300 行的文件,跟一个 100 多行的文件,每次读到多出来的 100 多行代码会占用大脑几个 cycle,有时还要多拖动两下,降低效率。 |
20
silva 2017-06-05 13:49:57 +08:00
@sagaxu 你这个解释是站不住脚的。这里的问题是在语法上混淆了简单赋值和函数调用,这不是你在逻辑上如何想这个问题就算了的。
两个不同的事情,用同样的语法来表示,就是一种混淆不清。这个地,我感觉没得洗。 至于你说 JAVA 优化的问题,跟这个问题无关 |
21
mko0okmko0 2017-06-05 15:22:37 +08:00
假设一个任务,同样的注解量,
kotlin 写只要 java 的 50%就能完成,并且性能达到 java 的 90%, 但性能要达到 java 的 95%就要写 120%以上, 你选用哪一个? 然后你不觉得这个问题很熟吗? 我举例 JPEG 压缩,在品质 75%以下过去 20 年有多少新格式能体积性能都赢它? JPEG 有太多问题,但它还是市场覆盖率选择率最高的影像储存格式,没有之一. 再例如 php 这个全世界最好的破烂玩意,依旧是 web 界最优选择之一. 所以能用 1 行语法完成功能,谁愿意写 10 行? 再说,"你要语意清晰很简单,该类用 java 写好,用 kotlin 去呼叫该 java 档案就好了", kotlin 从来没有要取代 java 过,其他的 JVM 语言我还觉得更有取代的念头. 所以到底有什么好争议的, 我还是浪费生命写了一篇回文,感觉自己蠢 |
22
sagaxu 2017-06-05 15:34:27 +08:00
@silva 你当然有权认为这是混淆,但是 C#,Swift,Python,Ruby,PHP,JS,VB 等等都是这么做的,这已经是比较 common 的 sense 了,也许 Java10 或者 Java11 也会引入这样的特性,你接受不了可以不用。哦,顺便说一下,即使是 Java6,用了注解,也会有一些改变语义的 magic 发生,是不是也是种混淆?还有==运算符,有时候比的是引用,有时候比的是值,你也别用了。
|
23
sagaxu 2017-06-05 15:35:50 +08:00 1
@mko0okmko0 Koltin 性能 >= Java,得益于 inline 方法
|
24
silva 2017-06-05 19:04:57 +08:00
|
26
sagaxu 2017-06-05 19:54:58 +08:00
@silva 对你来说是语义混淆,对我来说那是增强,它不会给我造成任何不清晰或者不明确,相反会节约我时间。
数量跟正确性无关,但是一大波主流语言的设计者们的共同选择,正确的可能性还是蛮高的。 从根本上说,是否加入 XX 特性可能无关正确性,而是各人根据自身经验和喜好,做的一个决定罢了。 ps: 从某种程度上讲,interface 和多态,是同类型同签名方法的不同语义,也是一种你眼中的混淆,只不过你没法回避这种混淆,只能认命。 |