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

我想知道为啥 Java 语言为什么怎么混乱

  •  
  •   bsg1992 · 2018-09-10 10:52:11 +08:00 · 10050 次点击
    这是一个创建于 2265 天前的主题,其中的信息可能已经有所发展或是发生改变。

    举个例子,一个基础的日期类型,就有 6 个。为什么不能简洁一点呢,真是想不懂。 枚举还得特么有构造函数我也是醉了。 C#做的就很好,C#在语言层次上真的是完爆 java

    81 条回复    2018-09-12 08:46:19 +08:00
    ych8398527
        1
    ych8398527  
       2018-09-10 11:00:21 +08:00
    C#工资低 (滑稽)
    q397064399
        2
    q397064399  
       2018-09-10 11:04:16 +08:00
    再看看隔壁 Python ..
    salamanderMH
        3
    salamanderMH  
       2018-09-10 11:04:21 +08:00
    这只是比较小的方面,java 开源方面比 C#好多了
    flyingghost
        4
    flyingghost  
       2018-09-10 11:07:57 +08:00   ❤️ 7
    Java 混乱?
    JavaScript 水深火热。
    PHP 笑而不语。
    murmur
        5
    murmur  
       2018-09-10 11:08:10 +08:00
    C#输在微软的策略上 开源的太晚了
    zzf2017
        6
    zzf2017  
       2018-09-10 11:08:25 +08:00
    月经贴变成日经贴了吗?
    cexy
        7
    cexy  
       2018-09-10 11:10:31 +08:00   ❤️ 4
    虽然我是个 javaer,但是我坚信 php 天下第一、
    yukiww233
        8
    yukiww233  
       2018-09-10 11:11:04 +08:00
    枚举必须有构造函数???
    引战还不在点上
    amew
        9
    amew  
       2018-09-10 11:12:19 +08:00
    这话说的。。Java 已经好于大多数语言了,你去看看 Kotlin,Python 等等,才多久啊,坑是一个接着一个,JS...算了,我已不想评价
    paparika
        10
    paparika  
       2018-09-10 11:12:39 +08:00
    枚举有构造也算黑点吗,以前好像还真写过利用枚举构造函数的代码
    metrxqin
        11
    metrxqin  
       2018-09-10 11:13:00 +08:00
    百花争鸣不好吗?
    wohenyingyu03
        12
    wohenyingyu03  
       2018-09-10 11:13:16 +08:00
    日期类型什么时候是“基础”了……
    bk201
        13
    bk201  
       2018-09-10 11:14:16 +08:00
    很多时候的啰嗦是为了对老版本程序的兼容.枚举也是类,为什么不能有构造函数?
    keymao
        14
    keymao  
       2018-09-10 11:17:20 +08:00   ❤️ 1
    Java 混乱?... 没听说过,我只知道 Spring 这种级别的脚手架,你其他语言的不好找...

    Java 在企业级应用里面目前几乎是不好替代了.. 他要真是混乱你觉得能行么
    lcgui7
        15
    lcgui7  
       2018-09-10 11:17:38 +08:00
    就事论事
    1. 时间日期在 java8 之前确实很烂,之后很好了
    2. C#的枚举不支持复杂对象吧?似乎没有可比性
    lhx2008
        16
    lhx2008  
       2018-09-10 11:21:06 +08:00 via Android
    java8 就直接 localdatetime,之前的 calender 不用了,date 比较通用一点
    lhx2008
        17
    lhx2008  
       2018-09-10 11:21:47 +08:00 via Android
    如果用百度搜索来学习,那么任何语言的学习过程都是混乱的
    murmur
        18
    murmur  
       2018-09-10 11:26:49 +08:00
    不敢苟同 前端的火爆和 JS 没啥关系吧。而且 web 端只有 JS 这一门语言而已,TS 也是扩展了 JS。说实话前端真的是没啥东西。

    我二线大连.NET 开发 3 年经验 32 万 20K*16

    觉得贵可以先用??版,啥时候能支撑的起在买一个正版支持一下

    楼主年薪 32w 你对前端就这个认知么??
    另外宣传 xx 是不是可以 deactivate
    ClutchBear
        19
    ClutchBear  
       2018-09-10 11:43:26 +08:00
    语言这东西,
    主要是看生态....
    wenzhoou
        20
    wenzhoou  
       2018-09-10 11:44:06 +08:00 via Android
    一般项目都会有自己的时间封装吧。如果没有,那就恭喜你。
    ywlvs
        21
    ywlvs  
       2018-09-10 11:49:20 +08:00
    别的不说,楼主你这个标题的语法就很混乱了。
    lovedebug
        22
    lovedebug  
       2018-09-10 11:50:47 +08:00 via Android   ❤️ 1
    历史遗留问题,最好搜的时候都带 java8,或者读文档吧
    lihongjie0209
        23
    lihongjie0209  
       2018-09-10 12:01:48 +08:00   ❤️ 1
    Date 对象在 JAVA 很早就有了, 以现在的眼光看, 确实有问题.

    后面出来一下其他的类来解决这个问题.

    目前的最优雅的解决方案是 JAVA8 的日期对象.


    混乱? 那倒不至于, 关键是你要理解这些对象存在的意义以及历史原因.

    如果说你非要在 JAVA8 中使用 Date 对象做一下很复杂的操作, 那么混乱的是你.
    AllOfMe
        24
    AllOfMe  
       2018-09-10 12:04:24 +08:00
    没有 apache common 之类的工具库,开发 java 确实比较繁琐
    chenstack
        25
    chenstack  
       2018-09-10 12:14:23 +08:00
    @amew 印象中 Python 诞生比 Java 还要早诶,Python 是 1991 年发行的,不晚了
    chocotan
        26
    chocotan  
       2018-09-10 12:16:21 +08:00
    就两个例子得出 java 混乱的结论
    sampeng
        27
    sampeng  
       2018-09-10 12:18:42 +08:00
    虽然我喜欢 python,但我还是想说 php 世界第一
    javaWeber
        28
    javaWeber  
       2018-09-10 12:24:33 +08:00
    还有 java 的 IO 包。。也挺混乱的。有过度设计的嫌疑。
    tnt666666
        29
    tnt666666  
       2018-09-10 12:25:36 +08:00 via Android
    因为你菜啊
    wizardforcel
        30
    wizardforcel  
       2018-09-10 12:28:25 +08:00
    Java 混乱的地方多了去了。。

    File 和 Path

    Array 和 List<T>

    各种 HTTP 客户端

    还有这个 BufferedReader,我记得 C# 的 StreamReader 是默认带缓冲的
    wizardforcel
        31
    wizardforcel  
       2018-09-10 12:31:01 +08:00
    @lihongjie0209 LocalDateTime 本身不复杂,无非是:

    new Date 改成 LocalDateTime.of

    setXxx 改成 withXxx 再赋值回去

    这点事情查个文档就好了

    混乱的是多个功能相同的名称不同的类
    shijingshijing
        32
    shijingshijing  
       2018-09-10 12:35:53 +08:00
    Java 里面 swap(int a, int b)也不行
    rockyou12
        33
    rockyou12  
       2018-09-10 12:36:19 +08:00
    java 是上世纪 90 年代诞生的,标准库有历史包袱、命名奇怪很正常啊……
    tongyang
        34
    tongyang  
       2018-09-10 12:37:58 +08:00
    你牛逼你写一个
    EPr2hh6LADQWqRVH
        35
    EPr2hh6LADQWqRVH  
       2018-09-10 12:44:51 +08:00
    不是 Java 乱,是 Java 人多。

    人多起来一个不小心就乱了。

    同理 JS。

    你看 Python,最近人也多起来了,看着吧,马上就乱。
    sudoz
        36
    sudoz  
       2018-09-10 13:02:13 +08:00
    你觉得混乱很可能是因为你用的不熟……
    当然也可能是因为用的熟的人已经习惯了
    sonyxperia
        37
    sonyxperia  
       2018-09-10 13:03:44 +08:00
    。。。。。。
    pabupa
        38
    pabupa  
       2018-09-10 13:06:02 +08:00   ❤️ 1
    这样的问题,我见一个 block 一个。
    AllOfMe
        39
    AllOfMe  
       2018-09-10 13:07:21 +08:00 via Android   ❤️ 1
    @avastms java 有一个好,人越多越不混乱,因为有着强规范
    nananqujava
        40
    nananqujava  
       2018-09-10 13:09:48 +08:00
    Java 确实很混乱, 不过开源的东西太多了, 就赢在这点
    congeec
        41
    congeec  
       2018-09-10 13:10:57 +08:00 via iPhone
    @tongyang 楼主不该被这样评价
    swim2sun
        42
    swim2sun  
       2018-09-10 13:22:48 +08:00
    喷得不在点子上。

    你有用脚投票的权力,欢迎转 C#,不送
    monsoon
        43
    monsoon  
       2018-09-10 13:24:08 +08:00   ❤️ 1
    因为时间很复杂,所以时间相关的 API 很难设计好……所以 Java 时间相关的 API 修了几次,但是还是不行,所以在 Java 8 又彻底修改了一次。

    为什么 C#的日期时间的 API 没那么多问题,因为 Java 比 C# 早了 5 年,所以 C# 有足够的经验可以选择借鉴设计一个更好的时间相关的 API 了。就像 Rust 的设计和类库为什么比起很多旧的语言设计的还要好,因为它有个理论和其他语言实践的地基在那里了,并且不用考虑兼容旧的 API 设计了。而 Java 还要在一开始旧的时间的 API 上进行改进,并且努力做到兼容旧的东西。

    为什么 Java 有 File, Files 和 Path 之类的问题?因为 Java 没有 first class 的 Object 支持,另外一个原因是后来的接口都是以 nio 为地基了,而 File 已经是时代所遗留的产物了。所以这里总是有抽象泄漏的。
    bumz
        44
    bumz  
       2018-09-10 13:27:53 +08:00
    Java 目前唯一的缺点是缺少 Value type,这点 Oracle 和 Gosling 也承认了

    很多类其实并不需要做成 Stateful,不需要(非抽象的)继承,引入这两者只会带来含糊和混乱

    然而从另一个角度没有 Value type 能大大降低虚拟机、Generic 的设计复杂度和实现难度,然而用作补偿的 Escape Analytics 也不是那么可靠。。。

    这也是为什么说了这么多年了,Java 的 Value type 连日程都不知道
    parkcg
        45
    parkcg  
       2018-09-10 14:56:49 +08:00
    php 和 python 笑而不语
    cpdyj0
        46
    cpdyj0  
       2018-09-10 15:00:44 +08:00   ❤️ 1
    枚举有构造函数明明可以更灵活,怎么反倒成黑点了?你说日期有好几个,为了兼容旧版本没办法的事。
    neptuno
        47
    neptuno  
       2018-09-10 15:11:58 +08:00
    理解了每一个的优缺点就不混乱了,还有,楼主别水了,233
    af463419014
        48
    af463419014  
       2018-09-10 15:34:21 +08:00
    如果你能仔细看一下 jdk 里注释的说明,应该就不会有这么多问题了
    关键原因就是以前的一些方法不符合国际规范,又不想把这些方法删除,所以只是加了 Deprecated 标记

    翻译一下:
    Date 是一个用毫秒保存的实例(也就是最终的时间是用一个毫秒数确定)
    jdk1.1 以前有两个额外的功能,一个是可以把毫秒转换 year,month,hour 等进行操作(也就是 setYear(2018)这种),一个是可以和字符串互相转换(也就是 new Date("2018-01-01")这种)

    但是这些额外的功能**不符合国际规范**,所以在 1.1 后,增加了 Calendar 可以和 date 互相转换,并进行具体时间字段操作(比如 setYear,setHour,getDayOfMonth 这些操作),还增加了 DateFormat 来进行 Date 和 String 的互相转换

    相应的功能在 Date 中会标记为 Deprecated(过期)
    比如 Date 中的 setHour 就标记了 Deprecated 并写明了可以使用 Calendar.set(Calendar.HOUR_OF_DAY, int hours)替代





    wocanmei
        49
    wocanmei  
       2018-09-10 16:31:55 +08:00
    xuanbg
        50
    xuanbg  
       2018-09-10 16:40:13 +08:00
    一些历史包袱而已,算不得混乱。JavaScript,著名地摊语言了解一下
    gabezhao
        52
    gabezhao  
       2018-09-10 16:48:29 +08:00   ❤️ 1
    住手,你们不要再打了啦!.jpg
    CYKun
        53
    CYKun  
       2018-09-10 17:00:52 +08:00 via Android
    C#也好意思说 Java, .net 1.1 到 2.0 的时候为了泛型另搞一套容器,至今还有一堆老式类型留在标准库里。

    语言要发展总要付出代价,想保持纯洁和完美要么一成不变,要么推到重来。事实证明一成不变的全都死了,推倒重来的如 python 挣扎了十年才看到了胜利的曙光。Java 选择了一条正确的路,即使每天都有无数人指着她的缺点吐槽,也撼动不了她的地位,终不过是土鸡瓦狗止增笑耳。
    ZhLTE
        54
    ZhLTE  
       2018-09-10 17:02:22 +08:00
    单就 equal。。就很乱了
    feverzsj
        55
    feverzsj  
       2018-09-10 17:04:18 +08:00
    因为 java 就是渣渣
    ThinkCat
        56
    ThinkCat  
       2018-09-10 17:14:48 +08:00
    毕竟那么多年了,各个版本迭代
    mosliu
        57
    mosliu  
       2018-09-10 17:15:27 +08:00
    java 这些年来 是能感受到在进步的。
    不喜欢的可以用脚投票啊。。
    zdnyp
        58
    zdnyp  
       2018-09-10 18:06:16 +08:00
    看看隔壁的 Python....
    ben1024
        59
    ben1024  
       2018-09-10 18:32:11 +08:00
    要不试试世界上最好的语言-PHP
    loryyang
        60
    loryyang  
       2018-09-10 18:37:41 +08:00
    大部分都是历史的包袱,扔不掉只能用妥协的方式来支持
    如果你像 python 那样搞,那会给 JAVA 造成重创的
    Guaidaodl
        61
    Guaidaodl  
       2018-09-10 18:56:19 +08:00 via Android
    主要是 Java 坚持向下兼容。而日期的 API 并不是那么好设计的。

    至于 enum 有构造函数我觉得是特别有用的功能。
    May725
        62
    May725  
       2018-09-10 19:13:58 +08:00 via iPhone
    我持不同的意见,觉得 java 的风格挺一致的。有些遗留的问题,你可以选择一种喜欢的方式去解决
    supuwoerc
        63
    supuwoerc  
       2018-09-10 20:31:12 +08:00
    呜呜呜,javascript 无辜中枪..
    tedzhou1221
        64
    tedzhou1221  
       2018-09-10 21:54:31 +08:00 via Android
    好的程序员都是扬长避短,不好的都是总是抓着短处不放
    murmur
        65
    murmur  
       2018-09-10 22:19:49 +08:00
    @ZhLTE 你应该去了解下 js 的类型转换
    woncode
        66
    woncode  
       2018-09-10 23:14:51 +08:00 via Android
    竟然吐槽枚举有构造函数,是你体会不到它的美。java 能发展壮大的很大原因恰恰是它不混乱
    qfdk
        67
    qfdk  
       2018-09-10 23:57:00 +08:00 via iPhone
    语言没有好坏 关键是看谁 怎么用...
    wanjun
        68
    wanjun  
       2018-09-11 06:59:06 +08:00 via Smartisan T1
    每一次版本升级都要向前兼容,当然有些设计不好的也必须要保留
    ZhLTE
        69
    ZhLTE  
       2018-09-11 09:20:35 +08:00
    @murmur 不是比谁更乱啊。。java 确实有很多遗留的东西不够友好 只能等一个大改了
    qingfengxm
        70
    qingfengxm  
       2018-09-11 09:30:05 +08:00
    C#工资低
    SunnyCoffee
        71
    SunnyCoffee  
       2018-09-11 10:02:24 +08:00
    看看 OC 再说吧,nil、Nil、NULL 和 NSNull,真是让人头皮发麻
    karllynn
        72
    karllynn  
       2018-09-11 10:29:14 +08:00
    历史问题嘛

    枚举设计最好的是 swift,总是新的超过旧的
    fundebug
        73
    fundebug  
       2018-09-11 10:39:09 +08:00
    @salamanderMH 如果说开源的话,JavaScript 完爆 Java 以及其他各种语言....
    JaxXu
        74
    JaxXu  
       2018-09-11 10:42:26 +08:00
    楼主大概是想要一个完全符合他个人想法习惯风格的语言,那就自己写一个好了
    taaaang
        75
    taaaang  
       2018-09-11 11:35:40 +08:00
    构造函数构造复杂枚举有问题? 日期类不停的升级换代,用你喜欢的不久好了?可能楼主需要一门自己的语言。
    gowk
        76
    gowk  
       2018-09-11 13:48:47 +08:00
    看了王垠的文章,谁知道这个思考题该怎么理解:
    有人指出,Java 的引用类型可以是 null,而原始类型不行,所以引用类型和值类型还是有区别的。但是其实这并不能否认本文指出的观点,你可以想想这是为什么吗?
    HangoX
        77
    HangoX  
       2018-09-11 14:24:15 +08:00
    历史包袱吧,java 兼容旧版比较多。讲道理枚举有构造方法哪里惹你了。。。
    jorneyr
        78
    jorneyr  
       2018-09-11 14:55:06 +08:00
    Java 的枚举使用的是 flyweight 设计模式,是个对象池,你心目中的枚举是什么样的呢?
    ihavecat
        79
    ihavecat  
       2018-09-11 15:54:17 +08:00
    @gabezhao 你为什么可以发动图
    douya0808
        80
    douya0808  
       2018-09-11 18:03:15 +08:00
    Java8 的日期已经很简洁了吧,8 以下版本引入一下 Joda-Time 也很好用
    mmdsun
        81
    mmdsun  
       2018-09-12 08:46:19 +08:00 via Android
    @ych8398527 c# unity3d 做游戏工资不低的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5341 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 03:37 · PVG 11:37 · LAX 19:37 · JFK 22:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.