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

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

  •  
  •   Oxonomy · 2 天前 · 7704 次点击

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

    > kotlin 就是这种感觉..

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



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