最近尝试在 PR 里面用了这个 Java10 就有的关键字,结果老外和国人都不能接受,让我改回去。
但是只要把变量命名写的足够表意,我觉得一定程度上是可以使用 var 关键字的。
难道 java boy 不写动态语言吗?
1
yooomu 3 天前 ![]() 我是完全没必要用,idea 直接 .var 就能自动帮我命名再加上类型,用什么 var
|
![]() |
2
iintothewind 3 天前 ![]() 我需要 Scala 风格的 val 和类型推断,然后成熟的 case class ,pattern-match ,不过分吧
|
![]() |
3
sagaxu 3 天前
有 var 就得有 val ,大部分情况用 val
|
![]() |
4
xboxv 3 天前 ![]() 人家习惯了用筷子, 你问为什么不直接用手.
|
![]() |
5
MossFox 3 天前 via Android ![]() 重点偏了,不是能不能接受的问题,在 pr 的时候是要遵循原项目的编码风格的。你跑去一个全是 var 的项目里面 pr 另一套风格的代码一样会被让改掉。
|
6
Leviathann 3 天前
@iintothewind java 现在偷的差不多了 也就 pattern matching 稍微弱了点,而且还把 scala 解构时根据参数顺序而不是名字解构的雷点也偷了
|
![]() |
7
Al0rid4l 3 天前
虽然但是, var 哪里动态了...
|
![]() |
8
ns09005264 3 天前
项目风格延续吧
|
![]() |
9
iintothewind 3 天前 ![]() @Leviathann #6 值类型还是很不错的, 可惜跟泛型擦除冲突了, 唉.
|
![]() |
12
Vegetable 3 天前
提 PR 是好事儿,但是风格一致也是非常合理的要求。这可能不是人家不接受,而是不希望出现这种混合风格。
|
13
Oxonomy OP |
![]() |
15
chendy 2 天前 ![]() 老 Java 农不请自来,个人觉得这个关键字并无卵用,写的时候没爽到哪里去(因为有 idea 的.var ),改的时候还麻烦
其实在 java 自带这玩意之前,lombok 就已经有 var 和 val 了,某个项目里尝试使用过。自我感觉团队水平尚可,代码质量也不错。但是半年之后再看代码发现很多地方都看不懂,本来点类型跳转进去扫一眼就行,这回需要点方法然后点返回值类型扫一眼,然后和同事们交流了一下大家基本都是这个感觉,于是后来的代码里就不再用了 |
![]() |
16
shuiguomayi 2 天前 via iPhone
@chendy 哈哈,有道理
|
![]() |
17
kandaakihito 2 天前 ![]() 因为 Java 项目大多是重业务的,一个小模块动不动就是几万行起步的业务代码,大概率还有一个产品经理在背后催进度。
这种情况下,类名也是可读性非常重要的一部分,满屏的 var 会直接把别人看红温。 |
18
yazinnnn0 2 天前 ![]() |
![]() |
19
qxmqh 2 天前
说实话,我就挺讨厌 这个 var 的。
|
![]() |
20
qxmqh 2 天前
即使我写 go 也不喜欢。直接就是 xx:=xxx
|
![]() |
21
joyhub2140 2 天前
var 表达力是差了点,可以一般用在简单的局部变量里的临时变量,并且命名要带上类型字眼。
还有一种情况,就是多重泛型嵌套的情况下,这个可以简化一点点写法。 其他情况一律不用了。 |
![]() |
22
k9982874 2 天前 via Android
代码是给人看的,机器能毫秒级推导,人脑能?
给你一个别人的模块去维护,里面全是 var 你骂不骂娘 |
23
dddd1919 2 天前
var 这个关键字在脚本语言看来都是多余,既然不需要声明类型那直接命名赋值就完了,a = 1
话说回来,代码体量上来了,变量声明类型显然更易读,var 是写的爽(也并没太爽),后面读起来就要挠头了 |
24
fredweili 2 天前
不同公司和项目的代码规范而已,爱用就在自己的项目尽情的用
|
25
Ayanokouji 2 天前
确实不好用,比如泛型,后者后面很长的一堆 stream
|
26
yanghanlin 2 天前 via Android
@DOLLOR Lombok 有 val 哦
|
28
flytsuki 2 天前 ![]() 习惯问题吧,我写 C#起手就是一个 var
|
![]() |
29
635925926 2 天前
因为然并卵,真正的动态语言应该像 php 那样。啥关键字都不用写。
|
![]() |
30
liuzhaowei55 2 天前 via Android
我用 Java 就是为了写样板代码来的,不想用 kotlin 也是基于这个原因
|
![]() |
31
Sodacooky 2 天前
用过 cpp 的 auto 过来还是能接受 var 的,但也是看场合使用。比如冗长的 new 语句和增强 for 循环里面,看一眼就知道是什么类型,其他情况下就很少用了。
比起这个,2025 年了还有很多 JavaBoy(或者说 SpringBoy?)还不知道有 var 才是更值得担心的。 |
![]() |
32
syubo2810 2 天前
var 不 var 有什么关系,我也用过很多早就支持 var 语言,正常写代码你定义这个变量时候早知道类型的,写 var 和指定类型没啥区别
|
![]() |
33
nealHuang 2 天前
var 的作用我理解就是左对齐,排版好看,不过可能影响一些可读性吧
|
![]() |
34
litchinn 2 天前
用过一次,但出现了别人改了代码居然没有编译错误导致 bug 的情况,就再也不用了
var Tuple; var Triple |
![]() |
35
HojiOShi 2 天前
我写 Java 也喜欢到处用 var ,如果这都不用,那写起来真是太枯燥了。
|
![]() |
36
fangxisama 2 天前
因为每个 Javaer 要遵守一些规范,其中之一就是强类型。你自嗨随便你,但是企业级项目不是你一个人写代码的,你看到满屏幕别人写的 val ,会是什么感受?
|
37
fengpan567 2 天前 ![]() 对不起,我只用 Object
|
![]() |
38
InkStone 2 天前
|
![]() |
39
TanKuku 2 天前
@fengpan567 #37 var 和 Object 可不是一回事,var 还是具体类型
|
40
purringpal 2 天前
尊重原项目风格,基本操守。但是 2025 年了写代码还在纠结这种鸡毛蒜皮的事情,也是浪费生命。
|
41
kneo 2 天前 via Android
不喜欢就是保守?非得喜欢你喜欢的?你写 Python 用类型标注吗?
|
42
mx1700 2 天前 via Android ![]() 因为大部分 java boy 不喜欢语法糖。
另外说 var 影响代码可读性,那只能说代码质量太差。 类型信息大多时候都是给编译器看的,读代码的时候都是干扰信息,所以较新的和教学术的语言都在搞非常强的类型推导,尽量保证不写类型也能有强类型约束。 |
![]() |
43
oneisall8955 2 天前
var 只在完整类型加在这一行会很长的情况下用
|
44
kisick 2 天前 via iPhone
新 java boy 表示强烈反对,写的时候没有便利,idea .var 就可以了,阅读的时候根本看不出来类型,可读性极差,你觉得优点在哪?
|
![]() |
45
AlexHsu 2 天前
var 并不是什么先进的玩意
|
![]() |
46
oneisall8955 2 天前
@fengpan567 #37 怎么可能,object 只有 tostring hashcode 几个方法
|
47
securityCoding 2 天前
浪费生命,这种鸡毛蒜皮小事 leader 拍板就行了不要去争论
|
![]() |
48
oneisall8955 2 天前
@yazinnnn0 #18 +1 ,当完整类型太长的时候我也用 var 减少行的字符长度
|
![]() |
49
liuliuliuliu 2 天前
@flytsuki +1 ,没有 var 活不了
|
![]() |
51
superchijinpeng 2 天前
all in kt
|
52
dcsuibian 2 天前 ![]() 我也反对用 var
因为 var 其实是做了类型推导的,而类型推导的结果不是我想要的 var q=new LinkedList<Integer>(); // 其实此时 q 是 LinkedList<Integer> 但如果没有 var ,我会这么写: Queue<Integer> q=new LinkedList<>(); 1 、用 var 的写法时,我就有可能在后面的代码中不小心调用了实现类 LinkedList 中特有的方法而不是 Queue 中通用的方法,这就导致如果我想切换实现类可能就会很麻烦 2 、如果你仅仅看 var 的这一行代码。当你看到 LinkedList 时,你可能第一反应是我想定义一个 List 而不是 Queue ,以为我想写成 List<Integer> q=new LinkedList<>(); 3 、移植性。如果我现在写了一段有 var 的示例代码(但是除此之外没有什么新特性的),那 Java 8 或更低版本的就不能拷过来直接用 |
53
zuixinwenyue 2 天前
被拒绝心里难受来找安慰的。人家项目如果没有用 var 的,就你用拒绝你就拒绝了,不要玻璃心
|
54
HaibaraDP 2 天前
机器可以很快的推导类型,但人达不到机器的速度。用 var 定义变量的项目我看不了一点,尤其是 python 这种语法“简洁”的
|
55
sir283 2 天前 via Android
op 技术栈更偏向前端,有这种疑问也正常,不少 c#boy 、jsboy ,也有类似的疑问。
这就要追溯到 c 语言的指针函数跟函数指针了 |
![]() |
56
Kamiyu0087 2 天前
不讨厌 var, 但讨厌没有 val
|
57
wwalkingg 2 天前 ![]() @dcsuibian 你说的场景,在平时开发中我认为不到 20%。
通常来说 var s = "Hello" 才是最常见的场景。 另外你说的问题其实也是有解决方案的 var q:Queue<Integer> =new LinkedList<>(); |
58
THESDZ 2 天前
java 设计的目标之一,就是拉高程序员写出程序的下限,包括但不限于,代码风格一致,代码可读性强,团队合作难度低。这也是 java 为什么这么啰唆的原因之一。
|
![]() |
59
RandomJoke 2 天前
@wwalkingg 所以,这么写为什么用 var- -
|
60
dcsuibian 2 天前
@wwalkingg 本来就不多出现啊,但是只要出现了一次就挺烦人的,尤其是你是和多个人一起协作的时候
但如果不用 var 就不会有这种问题,主要还是 var 的收益感觉太低,不如直接写明白 另外你说的 var q:Queue<Integer> =new LinkedList<>();是啥写法?我这边编译都通不过,而且就算通过了也是脱裤子放屁吧 还有现在这个时代更重要的,我刚刚想到的,现在有了 AI 代码补全,我写一个 String s=,AI 就有了足够的提示信息,更加容易帮我补全,但是你写个 var s=,AI 就不太行了吧 |
![]() |
61
MoYi123 2 天前 ![]() 2025 还在说 java 8 新特性的人是这样的.
|
![]() |
62
shijingshijing 2 天前
写 C 的看见这个更难受
|
![]() |
63
shijingshijing 2 天前
@635925926 话说 PHP 的变量不还是加了个$么?凑合也算是个关键字了。。。
|
65
yazinnnn0 2 天前 ![]() 嗨, 说白了还是撅醒人和老古董的冲突
问几个问题 1. 一般声明局部变量的时候, 要不要声明为 final 2. 如果需要闭包的效果, 你要咋实现(1. 包成数组, 2. 包成原子引用 AtomicReference, 3. 新建个类) 作为 kotlin 撅醒人现在干活写 java 实在是太痛苦了 |
![]() |
66
unco020511 2 天前
这项目还在用 java 你就只能这样写,否则就直接用 kotlin 了
|
67
aLazarus 2 天前 ![]() 基于项目管理人的角度来说,我是不允许出现这种关键字的,因为项目迭代的时间长,开发人员也会出现换人的情况,这样会增加成本。
基于项目开发者的角度来说,在代码补全和 ai 提示如此先进的现在,使用 var 关键词带来的收益并不明显,还会影响 ai 补全的功能,后续业务代码多了的话是否会增加调试成本,也是需要考虑的 |
![]() |
70
zizon 2 天前
class Var extends Object{}
Var t = new SomeType(); t.call_some(); t = new AnotherType(); t.call_some(); 感受一下. |
![]() |
71
dragondove 2 天前
@yazinnnn0 要在 lambda 中使用变量的话,最好的方式是使用一个包装类,性能最高(数组开销比单个引用对象大)。可以直接使用 apache commons 库里的 MutableInt/MutableObject ... 之类的类型。
|
72
jingdongkehu 2 天前
所以你想表达 你用 var 用出优越感了?
|
![]() |
73
shijingshijing 2 天前
@zizon 主打一个随心所欲,又不是不能用
|
74
macaodoll 2 天前
“不要你觉得”
|
75
black1 2 天前
用这个代码可读性太差了
|
![]() |
76
jaylee4869 2 天前
我自己偶尔用,而且是方法返回前最后的几行中(不影响前面主要的业务逻辑,因为前几行都是拿数据啥的,类型直观明显一点),且类型名称非常长的情况下才使用 var 。
|
![]() |
77
neptuno 2 天前 ![]() 多人协作项目,要考虑大家的风格统一问题。另外 idea 直接用.var 更方便了。而且你就用这么一个案例,就隐射所有写 java 的程序员,不太好吧,是不是太极端了
|
![]() |
78
DOLLOR 2 天前
@dddd1919
即使在脚本语言里 var 声明也是必要的,尤其是在有闭包机制、函数嵌套的编程语言,因为要明确变量所属的作用域。 就比如 python ,看似不需要声明变量,赋值即命名很方便。但是如果你想要修改的是外层作用域的变量,你反而还得多写一句 nonlocal xxx 或 global xxx 。 另外曾经还有一个叫 coffeescript 的语言,也是没有 var 声明,赋值即命名。它有个比 python 更“狂野”的地方,你在内层作用域想命名赋值一个新变量,如果这个新变量不小心跟外层的某个变量同名怎么办?不好意思,不会创建新的变量,而是修改了外层那个旧的变量。也就是说,这门语言不存在变量遮蔽( variable shadowing )机制,你写代码、复制粘贴代码时必须小心翼翼,避免偶然创建了跟外层同名的变量,否则产生的 bug ,会非常难以发现。 |
![]() |
79
codingKingKong 2 天前
我的习惯是:
1. new Axxx, 回车; 2.ctrl + shift + 回车; 3.ctrl + alt +v, 回车; done. 没有看到 var 存在的意义; 我倒是很喜欢 jdk15 时候的多行字符串, 可惜我司一直 jdk8 |
![]() |
80
Karte 2 天前
用 var 能够减少类型申明 (虽然可以通过 .val 快速申明), 但是会显示隐藏掉函数返回类型. 如果是一个新人进来看到一堆 var 关键字, 就得对每个方法进行 CTRL+Q 查阅方法返回数据类型, 或者进入方法内部查看, 相对不是十分便捷.
同样的, 由于 var 显示隐藏了对象的结构信息, 可以有效的把冗杂的类名或者泛型隐藏. 整体代码看起来会相对清爽 (但阅读同样存在障碍). 具体用还是不用, 一方面取决于团队内部, 还有一方面取决当前项目构型. 如果项目构型没有使用 var 关键字, 那尽可能不要使用, 会显著增加阅读代码的障碍 (虽然不是很大, 但有些人会觉得很头疼). 如果团队内部都支持, 建议在新项目内使用, 老项目则按部就班. 最好能在使用前与团队内部进行交流探讨, 让团队都了解这个特性, 并尝试了解他们所抵触的原因, 尝试对其进行化解才会更有效的推动新特性的使用. |
![]() |
81
olaloong 2 天前
声明对象直接 new XXX.var 回车自动补全结束了,难道还要手动把类型改成 var 吗?
|
![]() |
82
lux182 2 天前
静态类型为什么搞动态声明, java 是严谨的语言
|
![]() |
83
netabare 2 天前 via iPhone
可能 Javaer 担心写了 var 就变成动态语言了,会破坏了 Java 的类型系统
|
![]() |
84
taoboli 2 天前
用完 Kotlin 和 Golang 回来个人还是非常能接受 var 的
|
85
layxy 2 天前
自己写的爽,丝毫不考虑以后咋维护
|
86
ala2008 2 天前
现在 idea 都自动补全了,根本不用 var
|
![]() |
87
lonenol 2 天前
我不用 var 是因为在 idea 下边,用 var 没有任何优势,不论是可读性还是敲代码的速度。。
(作为把团队项目用的 jdk 从 8 强行升级到 21 的人,我应该算不上老古董 |
![]() |
89
coala 2 天前
我真的最烦争这些,我就希望有个开发规范吧这些都定好,都按规定来,还有接口命名之类的,我真是搞怕了...
一个项目里面全都一样最重要。 |
![]() |
90
agagega 2 天前 via iPhone
遇到 Cpp 模板这种不写 auto 根本写不出来的情况就老实了
|
92
luhongfei66 2 天前
那种代码可读性太差太差了,别人的类你都还没熟悉,全是 var 看起来头皮发麻,每个都得鼠标放上面看看这里是要什么类
|
![]() |
93
lisongeee 2 天前
|
94
chihiro2014 2 天前
var 我一般新建对象的时候用,如果取值用 var ,可能会空指针
|
![]() |
95
cubecube 2 天前
@yanghanlin 大部分人讨厌 lombok 。污染
同理,val 也污染。。除非新开项目,不然单独增加 val ,我也会拒绝回去 |
![]() |
97
chouchoui 2 天前
Java Boy 是这样的,突出一个嘴硬
|
99
Leviathann 2 天前
@dcsuibian 错误,正确的写法是
var queue = new ArrayDeque<Integer>(); |
100
dcsuibian 2 天前
@Leviathann 我是为了突显我说的两条才这么写的,所以我才把 queue 缩短成 q ,选用 LinkedList
我的意思是如果团队允许使用 var 的话,那么就有可能导致那两条不好的地方 |