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

Java 的缺点就是啰嗦 Java 的好处也就是这里了吧?

  •  2
     
  •   partystart · 2022-01-28 11:37:03 +08:00 · 10172 次点击
    这是一个创建于 1034 天前的主题,其中的信息可能已经有所发展或是发生改变。

    转了语言后 回过头来回忆下以前的做过的项目 感觉到 Java 项目的优点就是结构稳定吧

    Spring 提供官方脚手架,自己公司也可以基于脚手架进行定制化开发。 无论是新的项目还是以前老的项目包层次划分统一整齐。

    Maven 官方统一固定了文件路径 代码放 src 资源放 resousrce 有人想动这个路径 直接不支持 而且代码 review 直接骂的狗血淋头 我是没见过这年头有人不用 maven 做包管理的

    至于业务层次包 大家好像也形成了统一的规范? Api/RPC Service Dao Mdeol 这几层大体结构

    有没有同样的感想?

    95 条回复    2022-01-30 16:44:12 +08:00
    banmuyutian
        1
    banmuyutian  
       2022-01-28 11:39:53 +08:00
    统一的规范,写法上也没有太多的魔法
    LazyYum
        2
    LazyYum  
       2022-01-28 11:41:22 +08:00   ❤️ 2
    确实啰嗦,语言特性太弱。尤其是 orm 框架,在查询语法上和 C#比起来弱了一个层级
    powerman
        3
    powerman  
       2022-01-28 12:36:04 +08:00   ❤️ 1
    @LazyYum

    其实有 IDE 自动补全加强 语法啰嗦点真不是坏事,

    我看 typescript 跟 ant-design 写的那个 rule 检测表达式,简直就跟鬼画符一样,贼鸡儿难理解

    我再让你看看 swift 的不啰嗦 怕不是要把新手往死里坑

    https://stackoverflow.com/a/68696283/7250073

    https://i.stack.imgur.com/sJs9j.png
    golangLover
        4
    golangLover  
       2022-01-28 12:38:29 +08:00 via Android   ❤️ 1
    缺点很多。
    不支持协程,并发吞吐差
    只支持一个包名的一个版本,不能共存,时常版本被覆盖
    操作复杂 json 想吐
    没有原生热更新
    没有 async await
    Jooooooooo
        5
    Jooooooooo  
       2022-01-28 12:38:35 +08:00
    一种功能写法越少越好, 要不然有个一二十种方法写循环, 你最多用个两三种, 剩下的根本不用, 其他人用上了你还得重新学.
    powerman
        6
    powerman  
       2022-01-28 12:39:36 +08:00   ❤️ 9
    @LazyYum 而且语法糖越多,越容易坑人,少写的那点几个字符 根本省不了多少时间,让新手阅读起来那是真的坑人,而且大部分简写方式的语法糖 在 IDE 增强辅助下,根本不会降低效率,但是语法糖会直接降低 新手或者不熟练这门语言的程序员的心智负担。
    sutra
        7
    sutra  
       2022-01-28 12:40:13 +08:00
    "有人想动这个路径 直接不支持" - 其实支持的。
    只是遵循约定大于配置。
    powerman
        8
    powerman  
       2022-01-28 12:44:05 +08:00
    @Jooooooooo

    是啊,抽象能力是一回事,有模板跟范型可以进行抽象,提供这种抽象能力无可厚非,

    但是其他很多东西真的没必要搞几个回字的写法,像 js 里面的拉曼达表达式有好几种写法,

    最后的结果就是造成不熟练这门语言程序员的心智负担,而大部分时候多种写法并没有任何效率提升,

    除了带来不必要的心智负担

    stackoverflow.com/a/68696283/7250073

    以 Swift 为例,我光是看 Swift 这个 UI 声明,就浪费了大半天,其中至少包含了 3 个语法糖
    PDX
        9
    PDX  
       2022-01-28 12:57:25 +08:00   ❤️ 1
    最开始用 node.js 的时候感叹 js 的灵活和便捷,用 swift 的时候感受写代码居然还能这样炫酷

    可是时间长了发现,这样的语言给每个人施展拳脚的空间实在太大了,每个人都在炫技,这写人完全不考虑读代码的人的感受,可是真正好的代码不应该是清晰明了简单易懂的吗?

    据说 C++的作者故意提高了写代码的难度,而 java 却确实降低了写代码的难度。
    voidmnwzp
        10
    voidmnwzp  
       2022-01-28 12:57:31 +08:00 via iPhone
    @golangLover 你说的包名问题,自定义 classloader 没接触过?很多人都是这种半桶水,连 se 基础都没掌握好就来跟风吐槽
    pengtdyd
        11
    pengtdyd  
       2022-01-28 13:01:06 +08:00   ❤️ 2
    说 java 啰嗦的人估计是没有写过 c++
    powerman
        12
    powerman  
       2022-01-28 13:06:37 +08:00
    @PDX swift 的炫技 真的是难懂 trailing closure 以及 last param trailing closure 还有 setter 的省略写法...
    真的是无语 真不知道为啥 要加这么多语法糖 是为了干啥
    kogorou
        13
    kogorou  
       2022-01-28 13:12:03 +08:00
    萌新发抖
    xiao109
        14
    xiao109  
       2022-01-28 13:18:16 +08:00
    论最佳实践是否有必要
    partystart
        15
    partystart  
    OP
       2022-01-28 13:18:41 +08:00   ❤️ 6
    @sutra 想动就动被 只要脸皮够厚 不怕代码 review 被怼死。


    @golangLover
    1. 支持多线程就要支持协程?
    并发吞吐差 哪个场景?哪个框架对比 直接贴链接
    2 操作复杂 json 想吐
    官方的简陋 开源的方便
    3 没有原生热更新

    jdk 提供热更新 不过你要热更新干嘛?直接不发版部署?

    4 没有 async await

    jdk futureTask 了解一下


    5 只支持一个包名一个版本

    go 就支持? 我不理解 一个包名多个版本你到底想干嘛?热更新?

    还有 java 不负责管理包 目前是 maven 管理

    工作中少玩点花活行吗?
    gam2046
        16
    gam2046  
       2022-01-28 13:24:23 +08:00   ❤️ 1
    Java 这种语言就是下限高,瞎写,也能跑,也凑合能看懂,当然这方面,我觉得 C#比 Java 更好。

    其他比如 JavaScript ,来个变量连类型都不确定,c/cpp 的指针 void*又是万能指针,都需要对代码有相当的了解程度才能看懂意图。
    reeco
        17
    reeco  
       2022-01-28 13:31:32 +08:00 via iPhone
    Java 至少没 errlang 那么啰嗦吧
    shyangs
        18
    shyangs  
       2022-01-28 13:32:58 +08:00
    @powerman

    說的像 Java 的 Lambda 只有一種寫法(沒有語法糖). 我一樣可以用 Java 寫出兩種 Lambda.


    ```
    // Java 沒有語法糖
    Multiset<Integer> lengths = HashMultiset.create(
    FluentIterable.from(strings)
    .filter(new Predicate<String>() {
    public boolean apply(String string) {
    return CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string);
    }
    })
    .transform(new Function<String, Integer>() {
    public Integer apply(String string) {
    return string.length();
    }
    }));
    ```

    ```
    // Java8 加語法糖
    Multiset<Integer> lengths = HashMultiset.create(
    FluentIterable.from(strings)
    .filter(string -> CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string))
    .transform(string -> string.length()));
    ```


    有多少人喜歡第一種沒有語法糖的 0.0
    Leviathann
        19
    Leviathann  
       2022-01-28 13:37:57 +08:00 via iPhone   ❤️ 2
    @powerman 你学过 swift 吗
    如果没学过 那看不懂很正常
    我会 kotlin 不会 swift
    除了 some 关键字和 getter 省略没见过其他都很清楚啊
    如果所有语言语法都要和 java 一样那还发明新语言干嘛

    具体说说,
    最后一个 lambda 可以写在括号外面,
    如果只有一个 lambda 参数直接可以省略小括号
    如果 lambda 是无参数的可以省略参数声明和箭头
    lambda 最后一行就是返回值
    Scala 就有,kotlin 也学的 scala

    构造函数不用 new
    新语言很多都这样 new 就是多余的 构造函数就是普通的函数 不需要特殊对待
    powerman
        20
    powerman  
       2022-01-28 13:44:05 +08:00
    @shyangs 你这样杠就没意思了,能简洁的地方 简介并不是坏事,而且第一种并不是拉曼达 第一种是匿名类的方式
    这两种写法 并不会造成太大的理解困难

    我抨击的是 swift 跟 js 那种 会造成令人困惑的写法

    ![]( )
    powerman
        21
    powerman  
       2022-01-28 13:52:01 +08:00
    @Leviathann

    这就是通常程序员挑起语言圣战的起源,

    说实话 我根本不想争论这些东西,既然选择要吃 iOS 这个饭,肯定要吃这个屎,全盘接受是没办法的

    你提到的那几个省略,除了带来心智负担以及编译器 语法令牌树难以实现外 跟 程序员炫技之外

    我看不到任何好处在哪里,节省的那几个字符,在 IDE 补全下,也根本不是问题
    ysn2233
        22
    ysn2233  
       2022-01-28 13:52:11 +08:00
    java 啰嗦也导致代码很容易看懂
    WispZhan
        23
    WispZhan  
       2022-01-28 13:57:01 +08:00
    想要工程化,就必须牺牲一些灵活性。
    JVM 栈,目前依然还是工程化程度最高的开发工具之一。
    powerman
        24
    powerman  
       2022-01-28 13:57:29 +08:00
    @Leviathann 首先最后一个拉曼达可以写在括号外面,这个特性 我实在看不到好处在哪里,除了心智负担,另外写在外面就算了 把括号()都省了,那前面那个被调用的函数 就更难理解

    var body : some Scene {
    WindowGroup { ContentView() }
    }
    在一个不是很熟悉的 swift 语言的我,看 WindowGroup ContentView 结构体的定义 看了几遍,硬是没理解明白

    而且这些语法糖大多是没有提示 也没有解释的,只能去翻语法书,而且提出这个问题的人不仅是我
    https://stackoverflow.com/questions/65384567/swiftui-is-this-code-instantiating-a-new-scene-object
    dbpe
        25
    dbpe  
       2022-01-28 14:13:50 +08:00
    不支持协程这个倒是...导致一堆异步的操作需要类似 callback 回调..写起来真特么恶心
    lybcyd
        26
    lybcyd  
       2022-01-28 14:16:07 +08:00
    @powerman swift 为了声明式 UI 的确有点过了,不过 Java 离这个阶段还远着呢,现在完全用不着害怕语法糖影响可读性。别的不说,getter setter 到现在还得靠 lombok ,就算用了 lombok 也得 a.setX(a.getX+1),比较字符串还得 Object.equals ,List 和 Map 也只能 get, set ,不能用方括号直接取值赋值。目前来看,改掉这些东西完全不会影响可读性,反而会增加可读性。
    jorneyr
        27
    jorneyr  
       2022-01-28 14:16:15 +08:00
    不知道大家去看 Groovy 、Scala 写的大一点项目的代码是什么感想,我是想抽写代码的人。
    des
        28
    des  
       2022-01-28 14:20:59 +08:00 via iPhone
    别的就先不说,啰嗦居然成了优点?
    如果真的优秀,那为什么 Java 也在加语法糖?
    powerman
        29
    powerman  
       2022-01-28 14:22:46 +08:00
    @lybcyd

    是的,这点我也赞成,但是语法糖这个口子 一旦打开,很多时候就会走向反面,目前 lombok 这样的解决方案也没有那么难懂,而且很多历史原因 不少框架还依赖 java bean 的 getter setter 约定
    MakHoCheung
        30
    MakHoCheung  
       2022-01-28 14:23:44 +08:00
    @powerman 就是为了 SwiftUI 能用 DSL 写界面啊。就 Java 这种语法基本做不了声明式 UI ,就算利用上了 lamda 也是无论写起来跟读起来都很不好看(可以参考 JaFu https://github.com/spring-projects-experimental/spring-fu/tree/main/jafu)。尾随闭包之前一直有的,后面为了 SwiftUI 还加上了多尾随闭包,看过讨论说都是为了 SwiftUI

    其实扩展函数、尾随闭包这些语法很有利于编程语言作为 DSL ,作为类型安全的描述语言代替 XML 、HTML 、SQL
    des
        31
    des  
       2022-01-28 14:24:57 +08:00 via iPhone
    @des 以及为什么那么多基于 jvm 的“方言”?
    还有 Java 就不能整花活了?那可真小瞧 Java 了
    cyspy
        32
    cyspy  
       2022-01-28 14:26:48 +08:00
    上面说的很多都是 library 层的事情,只是语言提不提供官方实现和语法糖的问题,尤其是 java 生态已经有那么多编译时改代码和改 class 的工具,不存在什么功能实现不了的问题。倒不如说是 Spring 生态太一家独大,新技术懒得在 java 上下功夫
    lisongeee
        33
    lisongeee  
       2022-01-28 14:27:07 +08:00
    @partystart

    1.我寻思 async await 和 futureTask 有啥关系? async await 是用同步的写法来实现异步回调,简便了开发成本,拒绝回调地狱或者链式回调。async await 就是语法糖而已。

    2.只支持一个包名一个版本,如果 [email protected] 依赖 [email protected], [email protected] 依赖 [email protected] 并且 pack_B 的 1.0.0 到 2.0.0 有完全破坏性更改,请问如何同时安装 [email protected][email protected] ,并保证流畅运行 ?

    多版本包共存在 npm/pnpm/yarn 管理下是很常见的,但是 java 的模块机制已经决定很难 多版本共存
    powerman
        34
    powerman  
       2022-01-28 14:32:03 +08:00
    @MakHoCheung

    第我没觉得这种方式有什么优势在哪里,该用 DSL 应该就发明 DSL 去做,就像 HTML 用来描述结构,CSS 用来描述样式,各施其职,javascript 负责逻辑跟交互
    MakHoCheung
        35
    MakHoCheung  
       2022-01-28 14:33:10 +08:00
    @golangLover 不支持协程可以理解。并发吞吐差是什么鬼,底层有线程池和 Netty ,再往上层就是 Vert.x 、Quarkus 、Spring Flux ,这些一样可以做到高并发高吞吐,只是没这么流行而已😂
    hello2090
        36
    hello2090  
       2022-01-28 14:34:38 +08:00 via iPhone
    无所谓,谁给钱多就听谁,给我 200 万一年写 C 语言都行,C++, 150 万,Java go C# 100 万
    powerman
        37
    powerman  
       2022-01-28 14:36:13 +08:00
    @MakHoCheung 而且 C 时代,用宏创建 DSL 也不是新鲜事,但是读起来是真的难懂,当然 C 那个时代 连范型都没有,也可以理解
    MakHoCheung
        38
    MakHoCheung  
       2022-01-28 14:37:11 +08:00
    @powerman 你不觉得优势而已,但是现在就是这种潮流,JSX 、Flutter 、Jetpack Compose 、SwiftUI 都是这种。Gradle 的 build.gradle 就是用 Groovy DSL 或者 Kotlin DSL 代替 Maven 的 pom.xml 。Spring 的 Java Config 代替旧版本的基于 XML 的配置
    lolizeppelin
        39
    lolizeppelin  
       2022-01-28 14:37:22 +08:00
    你用 angluar 会发现....写 ts 也能写得和 java 一样啰啰嗦嗦 哈哈哈
    chniccs
        40
    chniccs  
       2022-01-28 14:37:45 +08:00
    真有劲呀,各位,都在家隔离着不能出门吗?
    Goooler
        41
    Goooler  
       2022-01-28 14:39:17 +08:00
    直接 kotlin 大一统就完了,不要太舒服
    Leonard
        42
    Leonard  
       2022-01-28 14:42:38 +08:00   ❤️ 1
    @powerman 对比 OC 写 UIKit ,SwiftUI 的花活是有点多
    des
        43
    des  
       2022-01-28 14:44:50 +08:00 via iPhone
    @chniccs 就地过年呢,没事干
    powerman
        44
    powerman  
       2022-01-28 14:50:02 +08:00
    @MakHoCheung JavaConfig 并没有那么难理解,也没有突破原先的语法,最多算是 SpringBoot 提供的一种特性,

    把拉曼达放外面,实在是不敢苟同这种做法,如果有需要,干脆为这种需求定制一种声明式语法都可以。
    reeco
        45
    reeco  
       2022-01-28 14:51:04 +08:00 via iPhone
    @lisongeee npm 这种弱鸡拿什么跟 maven 比?同包多版本可以实现,前面已经有人回答了,自定义 classloader 就行,轻量级重量级轮子都有
    lisongeee
        46
    lisongeee  
       2022-01-28 14:56:44 +08:00
    @reeco 是的,你是对的
    vate32
        47
    vate32  
       2022-01-28 14:57:46 +08:00
    你们要求太高了,语法糖少嫌写着啰嗦,加点语法糖又嫌对新手不友好
    tt0411
        48
    tt0411  
       2022-01-28 14:59:05 +08:00   ❤️ 1
    在企业里面, 特别是当团队成员水平各异时, 啰嗦不是坏事, 为了灵活而引入的宽松往往是 bug 的来源
    Leviathann
        49
    Leviathann  
       2022-01-28 15:07:37 +08:00
    @powerman 很方便啊
    只是占位用的语法元素,如果没歧义的话直接就删掉好了
    减少语法噪音,让人专注于逻辑本身

    写 js 、ts 的时候总要写一大堆的 () =>,又丑又麻烦 ,然而大括号已经被 object literal 用了没法化简
    x940727
        50
    x940727  
       2022-01-28 15:09:21 +08:00
    @golangLover JVM 的并发吞吐差? Golang 在同等吞吐下能和 Java 一样 low pause 吗?
    aicfe
        51
    aicfe  
       2022-01-28 15:50:43 +08:00
    java 也在不断发展,汲取其他语言的优点,我觉得挺好的
    charlie21
        52
    charlie21  
       2022-01-28 17:02:22 +08:00
    @powerman #6 思维模型反过来说就是心智负担。除非你不要任何思维模型,否则你总有心智负担。语法糖最多不过是把设计模式做到了编程语言里(在不要任何思维模型的情况下,的确没有心智负担,但还有设计模式等着你)
    wangtian2020
        53
    wangtian2020  
       2022-01-28 17:17:26 +08:00   ❤️ 1
    行吧,有人说 ()=> 丑和麻烦,那话就没法聊了
    ostholz
        54
    ostholz  
       2022-01-28 17:32:10 +08:00
    确实 Swift 正在变成下一个 C++, 新手上来如果不通读官方教程, 很多写法看的是一头雾水.
    但是再回头写 Java 就太痛苦了.
    mosliu
        55
    mosliu  
       2022-01-28 17:32:15 +08:00
    真做工程,语法糖太多真没必要
    idea 花点钱 语法糖省的时间自动提示都出来了。

    啰嗦?也可以说是明确吧。
    一段代码,写的时候复杂点,但是真的很稳定,易查错,很多问题,从问题找到代码很快就落实了。
    心智负担确实少一些
    SmiteChow
        56
    SmiteChow  
       2022-01-28 17:35:50 +08:00
    缺点是谁都能挣大钱,优点是能挣大钱。
    yazinnnn
        57
    yazinnnn  
       2022-01-28 17:42:11 +08:00
    有人搞错了一点,kotlin 的很多 dsl 语法之类的并不是标准库的东西,而是 kotlinx 库的,比如协程

    kotlin 因为语法的强大,可以自行写出来很多 java 做不到或者实现很困难的语法糖

    与其说看不懂语法糖,不如说不想学新的类库而已

    何况用 dsl 写程序就是未来趋势,毕竟广大 spring boy 天天在用的 spring 都有 router function 了


    今天写的一点代码

    @Bean
    fun coRoutes() = coRouter {
    GET("/queryLog") { req ->
    val ipMono = nullable {
    val ip = req.queryParamOrNull("ip").bind()
    val vo = loggerService.queryLogByIp(ip)
    vo?.let { ok().bodyValue(it) } ?: status(404).build()
    }
    val codeMono = nullable {
    val code = req.queryParamOrNull("code").bind()
    val vo = loggerService.queryLogByCode(code)
    vo?.let { ok().bodyValue(it) } ?: status(404).build()
    }
    val badMono = status(400).bodyValue("bad request")
    return@GET (ipMono ?: codeMono ?: badMono).awaitSingle()
    }

    GET("/sse") {
    val flux = loggerService.sse().map { it.t2 }
    ok().contentType(MediaType.TEXT_EVENT_STREAM)
    .body(flux).awaitSingle()
    }
    }
    abcbuzhiming
        58
    abcbuzhiming  
       2022-01-28 17:49:27 +08:00   ❤️ 2
    Java 的好处才不是啰嗦,是 Java 几乎堵死了所有可以玩魔法的路子,高手和普通人写的代码差不多。所以 Java 在软件工程化这个领域才能成为第一语言。
    Chinsung
        59
    Chinsung  
       2022-01-28 17:53:33 +08:00
    @golangLover #4
    不支持协程,并发吞吐差 ---------这两者是一回事吗?并发吞吐差体现在哪里?
    只支持一个包名的一个版本,不能共存,时常版本被覆盖 -------------我挺好奇哪个语言支持同一个同名类多版本存在。。
    操作复杂 json 想吐 --------------如果 JSON 序列化框架你全用 map 接,那大概和你想要的效果差不多,而且 fastjson 封装了一些 json 对象来操作,我觉得便利性还可以
    没有原生热更新 ----------------------真的吗真的吗,你要是了解 jvm 的 classloader ,你就会知道这个恰恰是比较优雅的热更新
    没有 async await ------------juc 的包是写的不够好吗。。。能看到内部实现的并发工具类难道不比语言直接提供的一个关键字要靠谱点?
    littlewing
        60
    littlewing  
       2022-01-28 17:59:37 +08:00
    要不要来了解下 modern c++
    hingbong
        61
    hingbong  
       2022-01-28 18:20:25 +08:00
    我们就不用 maven ,用 gradle+kotlin ,后端确实美滋滋
    Trim21
        62
    Trim21  
       2022-01-28 18:33:49 +08:00 via Android
    @partystart 第五点这个 go 真的支持…
    dallaslu
        63
    dallaslu  
       2022-01-28 19:06:11 +08:00
    @partystart 一个包名多个版本,是希望避免依赖冲突吧。可能是个 X Y 问题,虽然依赖冲突麻烦,但是一包多版本可能更麻烦
    sagaxu
        64
    sagaxu  
       2022-01-28 19:49:16 +08:00 via Android
    反正写过 Kotlin 或者 C#之后就再也不想写 Java 了,真的脏
    DOLLOR
        65
    DOLLOR  
       2022-01-28 21:13:41 +08:00 via Android
    @des
    就是酸葡萄心理。
    等以后新语法出来了还不是要吹得飞起。
    hingbong
        66
    hingbong  
       2022-01-28 21:57:00 +08:00 via Android
    @sagaxu kotlin 是真的舒服,生态也有
    yogogo
        67
    yogogo  
       2022-01-28 22:39:06 +08:00
    能挣钱的才是好东西,管他有啥缺点🐶
    ikas
        68
    ikas  
       2022-01-28 22:44:02 +08:00
    就像国内的软件,非要花拳绣腿什么都搞,真正核心的少的可怜.
    各种神奇语法符号,越怪异,越与众不同越会得到期待与满足.
    保持克制,发展核心.而不是乱搞什么语法.
    随手说几个上面的问题
    1.怎么内部隔离依赖?使用 module,不导出即可
    2.java 没有 await,
    保持使用线程池,同步代码,没必要大改,因为 java 虚拟线程后,不需要关心太多异步,你可以开上万个线程
    3.热更新?看看 tomcat 都可以随时加载,卸载 war,为啥..就算是安卓的官方热更新,那也是提供了一个接口给你 classloader,更不说没有限制的 jvm
    4.操作 json 复杂,确实,用 js 就是方便,然后随意点,然后出问题狂骂,谁 tm 加的属性...

    java 语言就不改么..推荐看看 jep 列表

    比如一个草案:

    var query = connection."SELECT * FROM \{table}";

    编译后,相当于
    connection :
    T apply(String template, List<Object> parameters);
    你可以同时处理参数名,与参数值,与最终 string
    tqccc
        69
    tqccc  
       2022-01-29 00:17:34 +08:00 via Android
    @golangLover 哥,你这爱 golang 有点魔怔了
    zsxeee
        70
    zsxeee  
       2022-01-29 08:18:36 +08:00 via Android
    要限制写法的话各位不用 lint 的吗
    GiantHard
        71
    GiantHard  
       2022-01-29 08:43:40 +08:00 via Android
    Jackson 反序列化泛型列表

    ```
    CollectionType typeReference =
    TypeFactory.defaultInstance().constructCollectionType(List.class, Dto.class);
    List<Dto> resultDto = objectMapper.readValue(content, typeReference);
    ```

    放到 JS/C# 里面就非常简单了 JSON.parse / JSONConvert.Deserialize

    对比起来,Java 真的太啰嗦了。而且这么一坨代码在没有 Copilot 这种人工智能加持下,Idea 能正确的补全出来吗?
    micean
        72
    micean  
       2022-01-29 09:21:02 +08:00
    @GiantHard

    这种程度的还好不算啰嗦,封装能解决的事。
    java 啰嗦主要在于项目里各种人为导致的设计模式的强迫实践,比如一定要写个 interface 再来写 impl ,给参数建各种 class ,注解流行之前还要写各种 xml 等等
    我直接赞美 ts 还有人说喜欢建各种 class 的形式 https://www.v2ex.com/t/830210
    所以萝卜白菜各有所爱吧……
    MakHoCheung
        73
    MakHoCheung  
       2022-01-29 09:35:12 +08:00
    @micean 那这种啰嗦是优点还是缺点呢,帖子的标题就问了
    Unicorns96
        74
    Unicorns96  
       2022-01-29 09:41:51 +08:00
    与其称为啰嗦,我更觉得是结构明确、意义明确、规范统一,个人觉得这是个优点。它更重要的优点就是在 web 领域生态强大,轮子多。当然缺点也很明显,性能相比于其他非虚拟机语言略低,占用内存略大。
    yazinnnn
        75
    yazinnnn  
       2022-01-29 09:55:14 +08:00
    首先,jvm 性能并不差,只是内存占用大而已,但是内存不值钱,带宽值钱

    其次,graal 可以让你的程序内存减小很多,起动速度快两个量级,适合云场景,但是如果长时间运行,aot 性能不如 jit ,内存也会暴涨
    zxjunz
        76
    zxjunz  
       2022-01-29 10:12:37 +08:00 via Android
    我觉得啰嗦但是很优雅吧
    kur0d3s
        77
    kur0d3s  
       2022-01-29 10:36:45 +08:00
    @GiantHard
    ```
    List<Object> objs = objectMapper.readValue(json, new TypeReference<List<Object>>(){});

    ```

    觉得 new 太丑,自己封装一下
    yazinnnn
        78
    yazinnnn  
       2022-01-29 10:49:45 +08:00
    java 不配谈优雅,c like 都不配
    micean
        79
    micean  
       2022-01-29 11:01:37 +08:00
    @MakHoCheung

    不能一棒子打死,好坏分开看吧。
    lombok 也好,代码生成器也好,javaer 也一直在努力减少啰嗦这个问题。
    kotlin 虽然写的很爽,但是看旧代码真的要比 java 更集中注意力才行
    hhjswf
        80
    hhjswf  
       2022-01-29 11:22:38 +08:00
    @micean 可是你说的这些跟 Java 都没关系啊。。xml 那是 spring 框架的问题,impl 那是规范问题
    micean
        81
    micean  
       2022-01-29 11:42:16 +08:00
    @hhjswf

    是啊,所以很多 java 的吐槽并不是 java 本身语言的事情。
    exceldream
        82
    exceldream  
       2022-01-29 12:17:44 +08:00 via Android
    @jorneyr scala 什么项目? 大佬。去瞅瞅
    yaphets666
        83
    yaphets666  
       2022-01-29 13:23:52 +08:00
    觉得 1 楼说的很对,写法没有魔法这点很重要
    Jwyt
        84
    Jwyt  
       2022-01-29 13:33:33 +08:00
    @GiantHard 为什么这样写,一般序列化反序列化不都是一行的事情么
    stockmaster
        85
    stockmaster  
       2022-01-29 13:54:51 +08:00
    都 2202 年了还没有 async await 。不思进取的 Java 。
    Leviathann
        86
    Leviathann  
       2022-01-29 14:20:51 +08:00 via iPhone
    @stockmaster
    loom 做差不多了应该明年就会出
    虚拟线程也没有函数染色
    akira
        87
    akira  
       2022-01-29 15:14:46 +08:00
    稳,培训成本低,老板肯定是最喜欢的了
    dany813
        88
    dany813  
       2022-01-29 20:56:29 +08:00
    js ts YYDS
    wobuhuicode
        89
    wobuhuicode  
       2022-01-29 23:01:14 +08:00
    写了三年 swift ,swift 的很多简写依旧让我懵逼。。。
    Bingchunmoli
        90
    Bingchunmoli  
       2022-01-29 23:17:07 +08:00
    作为个入门来讲,yarn 比 npm 强,maven 比 npm 强,尤其是刚开始学习各种满屏红色一个都看不懂,maven 配置镜像会稳定,不配置会提示网络问题,npm 什么都不是一堆堆栈信息 咱也是入门看不懂,搜索搜不出来。 java 的优势是语义清晰,通过 IDEA 大多数代码可看懂, 其他语言的好处是确实优雅,缺点是(学过 C 、python 、java 、javscript) ,硬是很多各种语法糖记不住,也不熟悉最终选择了 java 这种 lambda 在 java17 的时间仍然称之为 java8 "新特性"并且属于面试加分项。
    FrankHB
        91
    FrankHB  
       2022-01-30 02:51:47 +08:00
    缺点:爹是 Oracle 。
    好处:爹是 Oracle 。
    相比之下技术特征很大程度上可以跳过……

    都 2022 了……
    https://bugs.openjdk.java.net/browse/JDK-4511638
    Schubfach 的实现怕是到处跑了几年了,然而大概没几个知道原作者的 Java 实现和 paper 写到 v4 了吧……
    msg7086
        92
    msg7086  
       2022-01-30 08:07:13 +08:00
    Java 的好处是随便拉一个熟练使用其他语言的程序员过来就能写。
    同样的 Java 工程师岗位,我是写 Ruby 的,之前新来的一个哥们是写 C++的,我们都在做 Java 项目,没压力。
    坏处是没法写得魔法和简洁。
    我们组之前用 Java 7 ,连 lambda 都没有,写 JUnit 做个 mock ,一个 mock 就是六七行,一个 test 文件随便小几百行,满屏的 mock 加上匿名类。循环都写成循环,连个存档点都没法好好做。
    现在好不容易上了 Java 8 了,至少能写写 lambda 了,mock 也可以一行干一个方法了,循环也可以重写成 stream 了,开发轻松了不少,但和写 Ruby 比起来开发效率还是差了太多了。Ruby 项目我一星期干了一个生产系统出来,Rails+VueJS 三天时间做了一个 POC ,但是 Java 我做一个只有 1000 行左右代码的 story 花了差不多半个月,这还是只做了 Unit testing ,没做 Acceptance testing 的情况。
    如果老板不追着赶工的话,写 Java 还是挺舒服的,摸鱼摸个爽。追着赶工那就是地狱了。
    chenshun00
        93
    chenshun00  
       2022-01-30 09:57:56 +08:00
    既要,又要,还要
    kenvix
        94
    kenvix  
       2022-01-30 16:36:36 +08:00
    又到了喜闻乐见的预言大战时间了?
    byte10
        95
    byte10  
       2022-01-30 16:44:12 +08:00
    @pengtdyd 哈哈 虽然我只写过几个 hello world 的 C++,但是我感觉 C++ 又重又复杂。
    @partystart @Chinsung @golangLover golanglover 的意思是没有协程,常规编程的并发吞吐量确实不行,所谓的常规编程就是使用同步编程。java 其实也有 vert.x webflux 框架,虽然响应式编程不好开发,但是还是可以实现非常高并发吞吐量的,好像有一个排名,golang 也比不上 java 的。 没有 async await ,这个有点高端,感觉也是协程的一个实现吧? async await yield 在 js 有了解过。还能在 java 上?有点意思哈,我得赶紧学习下😄。
    @MakHoCheung 回答正确!!
    @sagaxu 好像用过 kotlin 都是极力推荐 kotlin 😂,感觉这个 kotlin 应该是有点东西的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1100 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 22:44 · PVG 06:44 · LAX 14:44 · JFK 17:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.