V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Oxonomy
V2EX  ›  Java

都已经 2025 年了,为什么 Java Boy 还是不能接受 var 关键字

  •  
  •   Oxonomy · 34 天前 · 9023 次点击
    这是一个创建于 34 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近尝试在 PR 里面用了这个 Java10 就有的关键字,结果老外和国人都不能接受,让我改回去。

    但是只要把变量命名写的足够表意,我觉得一定程度上是可以使用 var 关键字的。

    难道 java boy 不写动态语言吗?

    第 1 条附言  ·  33 天前
    PS: Java Boy 并不是贬义,这里等同于 Javaer
    114 条回复    2025-03-27 00:30:53 +08:00
    1  2  
    yooomu
        1
    yooomu  
       34 天前   ❤️ 12
    我是完全没必要用,idea 直接 .var 就能自动帮我命名再加上类型,用什么 var
    iintothewind
        2
    iintothewind  
       34 天前   ❤️ 1
    我需要 Scala 风格的 val 和类型推断,然后成熟的 case class ,pattern-match ,不过分吧
    sagaxu
        3
    sagaxu  
       34 天前
    有 var 就得有 val ,大部分情况用 val
    xboxv
        4
    xboxv  
       34 天前   ❤️ 3
    人家习惯了用筷子, 你问为什么不直接用手.
    MossFox
        5
    MossFox  
       34 天前 via Android   ❤️ 16
    重点偏了,不是能不能接受的问题,在 pr 的时候是要遵循原项目的编码风格的。你跑去一个全是 var 的项目里面 pr 另一套风格的代码一样会被让改掉。
    Leviathann
        6
    Leviathann  
       34 天前
    @iintothewind java 现在偷的差不多了 也就 pattern matching 稍微弱了点,而且还把 scala 解构时根据参数顺序而不是名字解构的雷点也偷了
    Al0rid4l
        7
    Al0rid4l  
       34 天前
    虽然但是, var 哪里动态了...
    ns09005264
        8
    ns09005264  
       34 天前
    项目风格延续吧
    iintothewind
        9
    iintothewind  
       34 天前   ❤️ 1
    @Leviathann #6 值类型还是很不错的, 可惜跟泛型擦除冲突了, 唉.
    Oxonomy
        10
    Oxonomy  
    OP
       34 天前
    @Al0rid4l 我想说的其实是,类似于 python 和 js 这种语言,即使你不写类型,也能声明变量。
    Oxonomy
        11
    Oxonomy  
    OP
       34 天前
    @MossFox 这倒是。。但是我觉得不使用 var 关键字,是 javaer 思想太过保守。 所以即使起新项目,也没人使用 var 。
    Vegetable
        12
    Vegetable  
       34 天前
    提 PR 是好事儿,但是风格一致也是非常合理的要求。这可能不是人家不接受,而是不希望出现这种混合风格。
    Oxonomy
        13
    Oxonomy  
    OP
       34 天前
    @Vegetable 是工作代码,peer review 。。

    当然其他人也有槽点,比如直接把 Repository 层吞了,纠结包装类和基础类型用哪个, 可能是和老外的编程风格不一样吧
    DOLLOR
        14
    DOLLOR  
       34 天前
    @sagaxu
    java 没有`val`,类似的功能要写成`final var`。
    因为要多打一个单词,所以 java 开发者不太愿意用。
    chendy
        15
    chendy  
       33 天前   ❤️ 13
    老 Java 农不请自来,个人觉得这个关键字并无卵用,写的时候没爽到哪里去(因为有 idea 的.var ),改的时候还麻烦

    其实在 java 自带这玩意之前,lombok 就已经有 var 和 val 了,某个项目里尝试使用过。自我感觉团队水平尚可,代码质量也不错。但是半年之后再看代码发现很多地方都看不懂,本来点类型跳转进去扫一眼就行,这回需要点方法然后点返回值类型扫一眼,然后和同事们交流了一下大家基本都是这个感觉,于是后来的代码里就不再用了
    shuiguomayi
        16
    shuiguomayi  
       33 天前 via iPhone
    @chendy 哈哈,有道理
    kandaakihito
        17
    kandaakihito  
       33 天前   ❤️ 2
    因为 Java 项目大多是重业务的,一个小模块动不动就是几万行起步的业务代码,大概率还有一个产品经理在背后催进度。
    这种情况下,类名也是可读性非常重要的一部分,满屏的 var 会直接把别人看红温。
    yazinnnn0
        18
    yazinnnn0  
       33 天前   ❤️ 9

    有一说一, 有时候业务复杂度就到这种程度了, 不用 var/val 推断, 标明了具体类型就有可读性了吗?

    要是有人能光看类型就才出来这玩意儿是干啥的, 那你就是这个👍
    qxmqh
        19
    qxmqh  
       33 天前
    说实话,我就挺讨厌 这个 var 的。
    qxmqh
        20
    qxmqh  
       33 天前
    即使我写 go 也不喜欢。直接就是 xx:=xxx
    joyhub2140
        21
    joyhub2140  
       33 天前
    var 表达力是差了点,可以一般用在简单的局部变量里的临时变量,并且命名要带上类型字眼。

    还有一种情况,就是多重泛型嵌套的情况下,这个可以简化一点点写法。

    其他情况一律不用了。
    k9982874
        22
    k9982874  
       33 天前 via Android
    代码是给人看的,机器能毫秒级推导,人脑能?
    给你一个别人的模块去维护,里面全是 var 你骂不骂娘
    dddd1919
        23
    dddd1919  
       33 天前
    var 这个关键字在脚本语言看来都是多余,既然不需要声明类型那直接命名赋值就完了,a = 1
    话说回来,代码体量上来了,变量声明类型显然更易读,var 是写的爽(也并没太爽),后面读起来就要挠头了
    fredweili
        24
    fredweili  
       33 天前
    不同公司和项目的代码规范而已,爱用就在自己的项目尽情的用
    Ayanokouji
        25
    Ayanokouji  
       33 天前
    确实不好用,比如泛型,后者后面很长的一堆 stream
    yanghanlin
        26
    yanghanlin  
       33 天前 via Android
    @DOLLOR Lombok 有 val 哦
    chendy
        27
    chendy  
       33 天前
    @yazinnnn0 有一说一,这个也就看着复杂其实结构很清晰
    但是如果没有后面这一串 IDE 补的类型信息,后人维护代码的时候,起手一个点,然后就不知道改接啥了
    flytsuki
        28
    flytsuki  
       33 天前   ❤️ 1
    习惯问题吧,我写 C#起手就是一个 var
    635925926
        29
    635925926  
       33 天前
    因为然并卵,真正的动态语言应该像 php 那样。啥关键字都不用写。
    liuzhaowei55
        30
    liuzhaowei55  
       33 天前 via Android
    我用 Java 就是为了写样板代码来的,不想用 kotlin 也是基于这个原因
    Sodacooky
        31
    Sodacooky  
       33 天前
    用过 cpp 的 auto 过来还是能接受 var 的,但也是看场合使用。比如冗长的 new 语句和增强 for 循环里面,看一眼就知道是什么类型,其他情况下就很少用了。
    比起这个,2025 年了还有很多 JavaBoy(或者说 SpringBoy?)还不知道有 var 才是更值得担心的。
    syubo2810
        32
    syubo2810  
       33 天前
    var 不 var 有什么关系,我也用过很多早就支持 var 语言,正常写代码你定义这个变量时候早知道类型的,写 var 和指定类型没啥区别
    nealHuang
        33
    nealHuang  
       33 天前
    var 的作用我理解就是左对齐,排版好看,不过可能影响一些可读性吧
    litchinn
        34
    litchinn  
       33 天前
    用过一次,但出现了别人改了代码居然没有编译错误导致 bug 的情况,就再也不用了
    var Tuple; var Triple
    HojiOShi
        35
    HojiOShi  
       33 天前
    我写 Java 也喜欢到处用 var ,如果这都不用,那写起来真是太枯燥了。
    fangxisama
        36
    fangxisama  
       33 天前
    因为每个 Javaer 要遵守一些规范,其中之一就是强类型。你自嗨随便你,但是企业级项目不是你一个人写代码的,你看到满屏幕别人写的 val ,会是什么感受?
    fengpan567
        37
    fengpan567  
       33 天前   ❤️ 1
    对不起,我只用 Object
    InkStone
        38
    InkStone  
       33 天前
    @fangxisama var 只是把显式类型标注变成了自动类型推导,也还是静态类型。

    新一点的静态类型语言(也几乎天然都是强类型语言),几乎没有需要显式写类型的。因为时代已经不一样了……
    TanKuku
        39
    TanKuku  
       33 天前
    @fengpan567 #37 var 和 Object 可不是一回事,var 还是具体类型
    purringpal
        40
    purringpal  
       33 天前
    尊重原项目风格,基本操守。但是 2025 年了写代码还在纠结这种鸡毛蒜皮的事情,也是浪费生命。
    kneo
        41
    kneo  
       33 天前 via Android
    不喜欢就是保守?非得喜欢你喜欢的?你写 Python 用类型标注吗?
    mx1700
        42
    mx1700  
       33 天前 via Android   ❤️ 3
    因为大部分 java boy 不喜欢语法糖。
    另外说 var 影响代码可读性,那只能说代码质量太差。
    类型信息大多时候都是给编译器看的,读代码的时候都是干扰信息,所以较新的和教学术的语言都在搞非常强的类型推导,尽量保证不写类型也能有强类型约束。
    oneisall8955
        43
    oneisall8955  
       33 天前
    var 只在完整类型加在这一行会很长的情况下用
    kisick
        44
    kisick  
       33 天前 via iPhone
    新 java boy 表示强烈反对,写的时候没有便利,idea .var 就可以了,阅读的时候根本看不出来类型,可读性极差,你觉得优点在哪?
    AlexHsu
        45
    AlexHsu  
       33 天前
    var 并不是什么先进的玩意
    oneisall8955
        46
    oneisall8955  
       33 天前
    @fengpan567 #37 怎么可能,object 只有 tostring hashcode 几个方法
    securityCoding
        47
    securityCoding  
       33 天前
    浪费生命,这种鸡毛蒜皮小事 leader 拍板就行了不要去争论
    oneisall8955
        48
    oneisall8955  
       33 天前
    @yazinnnn0 #18 +1 ,当完整类型太长的时候我也用 var 减少行的字符长度
    liuliuliuliu
        49
    liuliuliuliu  
       33 天前
    @flytsuki +1 ,没有 var 活不了
    InkStone
        50
    InkStone  
       33 天前
    @kisick 你在用什么编程,vim 吗? inlay type hint 所有 IDE 都支持……
    superchijinpeng
        51
    superchijinpeng  
       33 天前
    all in kt
    dcsuibian
        52
    dcsuibian  
       33 天前   ❤️ 3
    我也反对用 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 或更低版本的就不能拷过来直接用
    zuixinwenyue
        53
    zuixinwenyue  
       33 天前
    被拒绝心里难受来找安慰的。人家项目如果没有用 var 的,就你用拒绝你就拒绝了,不要玻璃心
    HaibaraDP
        54
    HaibaraDP  
       33 天前
    机器可以很快的推导类型,但人达不到机器的速度。用 var 定义变量的项目我看不了一点,尤其是 python 这种语法“简洁”的
    sir283
        55
    sir283  
       33 天前 via Android
    op 技术栈更偏向前端,有这种疑问也正常,不少 c#boy 、jsboy ,也有类似的疑问。

    这就要追溯到 c 语言的指针函数跟函数指针了
    Kamiyu0087
        56
    Kamiyu0087  
       33 天前
    不讨厌 var, 但讨厌没有 val
    wwalkingg
        57
    wwalkingg  
       33 天前   ❤️ 1
    @dcsuibian 你说的场景,在平时开发中我认为不到 20%。
    通常来说 var s = "Hello" 才是最常见的场景。
    另外你说的问题其实也是有解决方案的 var q:Queue<Integer> =new LinkedList<>();
    THESDZ
        58
    THESDZ  
       33 天前
    java 设计的目标之一,就是拉高程序员写出程序的下限,包括但不限于,代码风格一致,代码可读性强,团队合作难度低。这也是 java 为什么这么啰唆的原因之一。
    RandomJoke
        59
    RandomJoke  
       33 天前
    @wwalkingg 所以,这么写为什么用 var- -
    dcsuibian
        60
    dcsuibian  
       33 天前
    @wwalkingg 本来就不多出现啊,但是只要出现了一次就挺烦人的,尤其是你是和多个人一起协作的时候
    但如果不用 var 就不会有这种问题,主要还是 var 的收益感觉太低,不如直接写明白

    另外你说的 var q:Queue<Integer> =new LinkedList<>();是啥写法?我这边编译都通不过,而且就算通过了也是脱裤子放屁吧

    还有现在这个时代更重要的,我刚刚想到的,现在有了 AI 代码补全,我写一个 String s=,AI 就有了足够的提示信息,更加容易帮我补全,但是你写个 var s=,AI 就不太行了吧
    MoYi123
        61
    MoYi123  
       33 天前   ❤️ 3
    2025 还在说 java 8 新特性的人是这样的.
    shijingshijing
        62
    shijingshijing  
       33 天前
    写 C 的看见这个更难受
    shijingshijing
        63
    shijingshijing  
       33 天前
    @635925926 话说 PHP 的变量不还是加了个$么?凑合也算是个关键字了。。。
    MRG0
        64
    MRG0  
       33 天前
    @sir283 #55 前端都不用了吧,都是 let const
    yazinnnn0
        65
    yazinnnn0  
       33 天前   ❤️ 2
    嗨, 说白了还是撅醒人和老古董的冲突

    问几个问题
    1. 一般声明局部变量的时候, 要不要声明为 final
    2. 如果需要闭包的效果, 你要咋实现(1. 包成数组, 2. 包成原子引用 AtomicReference, 3. 新建个类)


    作为 kotlin 撅醒人现在干活写 java 实在是太痛苦了
    unco020511
        66
    unco020511  
       33 天前
    这项目还在用 java 你就只能这样写,否则就直接用 kotlin 了
    aLazarus
        67
    aLazarus  
       33 天前   ❤️ 1
    基于项目管理人的角度来说,我是不允许出现这种关键字的,因为项目迭代的时间长,开发人员也会出现换人的情况,这样会增加成本。

    基于项目开发者的角度来说,在代码补全和 ai 提示如此先进的现在,使用 var 关键词带来的收益并不明显,还会影响 ai 补全的功能,后续业务代码多了的话是否会增加调试成本,也是需要考虑的
    wwalkingg
        68
    wwalkingg  
       33 天前
    @dcsuibian #60 除了 Java ,你是否接触过其他语言?
    wwalkingg
        69
    wwalkingg  
       33 天前
    @dcsuibian #60 除了 Java ,你是否接触过其他语言?
    @dcsuibian #60 我偏题了,我说的不是 Java 了已经,sorry
    zizon
        70
    zizon  
       33 天前
    class Var extends Object{}

    Var t = new SomeType();
    t.call_some();

    t = new AnotherType();
    t.call_some();

    感受一下.
    dragondove
        71
    dragondove  
       33 天前
    @yazinnnn0 要在 lambda 中使用变量的话,最好的方式是使用一个包装类,性能最高(数组开销比单个引用对象大)。可以直接使用 apache commons 库里的 MutableInt/MutableObject ... 之类的类型。
    jingdongkehu
        72
    jingdongkehu  
       33 天前
    所以你想表达 你用 var 用出优越感了?
    shijingshijing
        73
    shijingshijing  
       33 天前
    @zizon 主打一个随心所欲,又不是不能用
    macaodoll
        74
    macaodoll  
       33 天前
    “不要你觉得”
    black1
        75
    black1  
       33 天前
    用这个代码可读性太差了
    jaylee4869
        76
    jaylee4869  
       33 天前
    我自己偶尔用,而且是方法返回前最后的几行中(不影响前面主要的业务逻辑,因为前几行都是拿数据啥的,类型直观明显一点),且类型名称非常长的情况下才使用 var 。
    neptuno
        77
    neptuno  
       33 天前   ❤️ 1
    多人协作项目,要考虑大家的风格统一问题。另外 idea 直接用.var 更方便了。而且你就用这么一个案例,就隐射所有写 java 的程序员,不太好吧,是不是太极端了
    DOLLOR
        78
    DOLLOR  
       33 天前
    @dddd1919
    即使在脚本语言里 var 声明也是必要的,尤其是在有闭包机制、函数嵌套的编程语言,因为要明确变量所属的作用域。

    就比如 python ,看似不需要声明变量,赋值即命名很方便。但是如果你想要修改的是外层作用域的变量,你反而还得多写一句 nonlocal xxx 或 global xxx 。

    另外曾经还有一个叫 coffeescript 的语言,也是没有 var 声明,赋值即命名。它有个比 python 更“狂野”的地方,你在内层作用域想命名赋值一个新变量,如果这个新变量不小心跟外层的某个变量同名怎么办?不好意思,不会创建新的变量,而是修改了外层那个旧的变量。也就是说,这门语言不存在变量遮蔽( variable shadowing )机制,你写代码、复制粘贴代码时必须小心翼翼,避免偶然创建了跟外层同名的变量,否则产生的 bug ,会非常难以发现。
    codingKingKong
        79
    codingKingKong  
       33 天前
    我的习惯是:
    1. new Axxx, 回车;
    2.ctrl + shift + 回车;
    3.ctrl + alt +v, 回车;
    done. 没有看到 var 存在的意义;
    我倒是很喜欢 jdk15 时候的多行字符串, 可惜我司一直 jdk8
    Karte
        80
    Karte  
       33 天前
    用 var 能够减少类型申明 (虽然可以通过 .val 快速申明), 但是会显示隐藏掉函数返回类型. 如果是一个新人进来看到一堆 var 关键字, 就得对每个方法进行 CTRL+Q 查阅方法返回数据类型, 或者进入方法内部查看, 相对不是十分便捷.

    同样的, 由于 var 显示隐藏了对象的结构信息, 可以有效的把冗杂的类名或者泛型隐藏. 整体代码看起来会相对清爽 (但阅读同样存在障碍).

    具体用还是不用, 一方面取决于团队内部, 还有一方面取决当前项目构型.
    如果项目构型没有使用 var 关键字, 那尽可能不要使用, 会显著增加阅读代码的障碍 (虽然不是很大, 但有些人会觉得很头疼).
    如果团队内部都支持, 建议在新项目内使用, 老项目则按部就班.

    最好能在使用前与团队内部进行交流探讨, 让团队都了解这个特性, 并尝试了解他们所抵触的原因, 尝试对其进行化解才会更有效的推动新特性的使用.
    olaloong
        81
    olaloong  
       33 天前
    声明对象直接 new XXX.var 回车自动补全结束了,难道还要手动把类型改成 var 吗?
    lux182
        82
    lux182  
       33 天前
    静态类型为什么搞动态声明, java 是严谨的语言
    netabare
        83
    netabare  
       33 天前 via iPhone
    可能 Javaer 担心写了 var 就变成动态语言了,会破坏了 Java 的类型系统
    taoboli
        84
    taoboli  
       33 天前
    用完 Kotlin 和 Golang 回来个人还是非常能接受 var 的
    layxy
        85
    layxy  
       33 天前
    自己写的爽,丝毫不考虑以后咋维护
    ala2008
        86
    ala2008  
       33 天前
    现在 idea 都自动补全了,根本不用 var
    lonenol
        87
    lonenol  
       33 天前
    我不用 var 是因为在 idea 下边,用 var 没有任何优势,不论是可读性还是敲代码的速度。。
    (作为把团队项目用的 jdk 从 8 强行升级到 21 的人,我应该算不上老古董
    Nitsuya
        88
    Nitsuya  
       33 天前
    @chendy #15 kotlin 就是这种感觉..
    coala
        89
    coala  
       33 天前
    我真的最烦争这些,我就希望有个开发规范吧这些都定好,都按规定来,还有接口命名之类的,我真是搞怕了...
    一个项目里面全都一样最重要。
    agagega
        90
    agagega  
       33 天前 via iPhone
    遇到 Cpp 模板这种不写 auto 根本写不出来的情况就老实了
    Oxonomy
        91
    Oxonomy  
    OP
       33 天前
    @sir283 倒也不是前端技术栈,还是后端技术栈。 只是看 Go 和 Python 和 Rust 都可以不写
    luhongfei66
        92
    luhongfei66  
       33 天前
    那种代码可读性太差太差了,别人的类你都还没熟悉,全是 var 看起来头皮发麻,每个都得鼠标放上面看看这里是要什么类
    lisongeee
        93
    lisongeee  
       33 天前
    @Nitsuya

    > kotlin 就是这种感觉..

    呃呃,我写的假 kotlin ?,idea 不是自带类型推导显示吗?



    并且 idea 自动推导出来的灰色类型文本可以鼠标点击跳转类源码
    chihiro2014
        94
    chihiro2014  
       33 天前
    var 我一般新建对象的时候用,如果取值用 var ,可能会空指针
    cubecube
        95
    cubecube  
       33 天前
    @yanghanlin 大部分人讨厌 lombok 。污染
    同理,val 也污染。。除非新开项目,不然单独增加 val ,我也会拒绝回去
    cubecube
        96
    cubecube  
       33 天前
    @lisongeee 大点的公司,repo 都有公共的 CR 模块,语法提示基本实根据 vscode 走的,不能拿 idea 的功能硬套
    chouchoui
        97
    chouchoui  
       33 天前
    Java Boy 是这样的,突出一个嘴硬
    sagaxu
        98
    sagaxu  
       33 天前
    @cubecube 哪些大点公司 Java/Kotlin 项目指定用 vscode 啊? IDEA/Android Studio 在中大厂很非主流么。
    Leviathann
        99
    Leviathann  
       33 天前
    @dcsuibian 错误,正确的写法是
    var queue = new ArrayDeque<Integer>();
    dcsuibian
        100
    dcsuibian  
       33 天前
    @Leviathann 我是为了突显我说的两条才这么写的,所以我才把 queue 缩短成 q ,选用 LinkedList
    我的意思是如果团队允许使用 var 的话,那么就有可能导致那两条不好的地方
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1275 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:37 · PVG 07:37 · LAX 16:37 · JFK 19:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.