我想知道为啥 Java 语言为什么怎么混乱 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
bsg1992
V2EX    程序员

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

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

    举个例子,一个基础的日期类型,就有 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 已经是时代所遗留的产物了。所以这里总是有抽象泄漏的。
    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  
    PRO
       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     Solana     993 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 18:46 PVG 02:46 LAX 10:46 JFK 13:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86