为啥类属性 Kotlin 要贬低 Java

2017-06-04 20:19:01 +08:00
 muziling
比如以下:
public class Person {
var name: String = ""
}
...
val person = Person()
person.name = "name"
val name = person.name
Kotlin 教程总要说 Java 傻,要用 getter 和 setter,Java 把 name 定义成 public,照样不需要 getter 和 setter。
实在不理解为啥这个地方要秀一下优越性。
8747 次点击
所在节点    Kotlin
28 条回复
wwqgtxx
2017-06-04 20:23:48 +08:00
能问出这个问题就能充分体现出你根本没有弄懂 getter 和 setter 存在的必要性
cwek
2017-06-04 20:34:23 +08:00
同不知道 getter,setter 的重要性

不过 Java 有 IDE 自动生成的话,这个算是 IDE 的糖?
yuhuan66666
2017-06-04 20:42:52 +08:00
同不懂,求大神解释
muziling
2017-06-04 20:45:10 +08:00
@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;
}
}
xupefei
2017-06-04 20:51:14 +08:00
getter 和 setter 的意义在于可以在赋值的同时做一些其它的事,例如

```
getXXX {
xxx = value;
DoSomeWork();
}
```

Java 上倒是有个 Project Lombok,可以给 变量加 @Getter 和 @Setter 自动生成相应的方法。
xupefei
2017-06-04 20:55:09 +08:00
@xupefei 说白了还是 C# 好,可以直接写

public string XXX {
....get=>_xxx;
....set {
........_xxx=value;
........DoSomething();
....}
}
sagaxu
2017-06-04 21:02:38 +08:00
你没 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 一直原地踏步。
searene
2017-06-04 21:04:50 +08:00
据我所见,很多情况下 class 里面的 getter 和 setter 都只有一行代码,跟直接把字段暴露为 public 没有什么区别,但很多人还是习惯直接生成 getter 和 setter。
hyperdak288
2017-06-04 21:10:27 +08:00
话说这个特性不是 groovy 早就有了么,为什么也能吹一波?
Sharuru
2017-06-04 21:20:07 +08:00
Lombok 多好用……管那么多
Kotlin 这种四不像语言……

嘛,黑 Java 反正 P.C.
geelaw
2017-06-04 21:23:55 +08:00
原因里面最显然的一个:get/set 可以 override,一个公有字段不能。

再举一个例子:并不是所有的属性都有一个成员和它对应,例如一个代表 Windows 窗口的类,它的成员可能只有一个 handle,设置、获取窗口标题是通过 API 完成的。
royzxq
2017-06-04 22:58:01 +08:00
js 瑟瑟发抖
DCjanus
2017-06-05 00:40:11 +08:00
@searene 为了将来可能的修改啊,而且 Java 的很多框架都是依赖 set 和 get 方法做反射
linux40
2017-06-05 09:29:57 +08:00
其实也就长得不一样,其它没区别。
bk201
2017-06-05 09:30:03 +08:00
那应该问为什么用 private
silva
2017-06-05 10:13:55 +08:00
@sagaxu 如你所说的话,我觉得这是个很蠢的特性呢?
同样是看到一句 aa.b = xx 的赋值语句,我需要看上下文才知道这是一句直接的赋值还是调用了 setter 函数。

这类看似简便,实则引入混乱的语法糖最让人讨厌了
af463419014
2017-06-05 10:45:58 +08:00
@sagaxu @silva
我也认为 kotlin 提供的这个语法糖是一个得不偿失的改进,为了代码上的精简,导致了语义的不清晰
如果整个团队都熟悉 kotlin 还好
但是对于大多数普通的开发人员,只会让代码变得难以理解

虽然 java 的 getter,setter 需要很多冗余的代码,但是 ide 里提供了快捷键添加,实际开发中并不会耽误我们时间
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)
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,有时还要多拖动两下,降低效率。
silva
2017-06-05 13:49:57 +08:00
@sagaxu 你这个解释是站不住脚的。这里的问题是在语法上混淆了简单赋值和函数调用,这不是你在逻辑上如何想这个问题就算了的。
两个不同的事情,用同样的语法来表示,就是一种混淆不清。这个地,我感觉没得洗。

至于你说 JAVA 优化的问题,跟这个问题无关

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/365907

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX