yuntong
V2EX  ›  Java

为啥 Java 的输出语句这么长?

  •  
  •   yuntong · Feb 4, 2016 · 8583 views
    This topic created in 3766 days ago, the information mentioned may be changed or developed.

    System.out.println("");

    对比其他语言的输出语句会发现它很长.

    有人说也可以把这个做短了啊!

    那为啥 java 官方不把他做短了呢?

    51 replies    2016-02-06 15:36:35 +08:00
    zts1993
        1
    zts1993  
       Feb 4, 2016
    log.info 并不是很长。
    WenhaoWu
        2
    WenhaoWu  
       Feb 4, 2016
    ide 里不都是 sout 然后 tab 吗
    dullwit
        3
    dullwit  
       Feb 4, 2016
    Java 里的方法都是依赖于类,不能存在独立的函数。
    唯一的办法就是 import static
    echo1937
        4
    echo1937  
       Feb 4, 2016
    一般靠 IDE 进行快速输入,至于看着看无所谓。
    raysonx
        5
    raysonx  
       Feb 4, 2016   ❤️ 1
    因為 Java 信仰面向對象(雖然 int,double 等値類型的實例不是對象)
    iburu
        6
    iburu  
       Feb 4, 2016
    scala 大法好
    jasontse
        7
    jasontse  
       Feb 4, 2016 via Android
    做短了就破坏 Java 原有的语法结构和规则了啊
    shoaly
        8
    shoaly  
       Feb 4, 2016   ❤️ 1
    当初从 java 跳 php 的一个原因就是 java 没有系统函数 类似 md5, json_encode, 想不通
    ppwangs
        9
    ppwangs  
       Feb 4, 2016   ❤️ 1
    import static java.lang.System.out;
    ...
    {
    out.print("我也不是很长");
    }
    htfy96
        10
    htfy96  
       Feb 4, 2016
    @ppwangs 这个和#define P(X) printf(#X) 然后 P(我更短)有什么区别…
    ppwangs
        11
    ppwangs  
       Feb 4, 2016
    @htfy96 copy 一段
    static import 是 Java 5 增加的功能。
    就是将 Import 类中的静态方法,可以作为本类的静态方法来用。
    谁让 java 面向对象来的。
    SilentDepth
        12
    SilentDepth  
       Feb 4, 2016
    严格信仰 OO 的结果。「上帝先创造了 System ,并告诉它 out ,才有了 println()……」
    shyling
        13
    shyling  
       Feb 4, 2016 via iPad
    常就长呗~
    std::cout<<"长与短并不重要";
    Console.Write("楼上说的对");
    spance
        14
    spance  
       Feb 4, 2016   ❤️ 6
    java 世界不会凭空存在一个 printf(),方法是一个对象的属有的,对象要是基于一个类(模板)来产生的。

    out 是 java.lang.System 类的一个静态成员,为什么要放到 System 类,因为 stdout,stderr 等是由 system 提供的;

    out 成员具有 print,write 等方法,表示这些 write print 的操作就是说这个 out 实例自己有这个行为,而不是莫名其妙冒出一个全局的行为。

    属主(对象)才会自己具有行为,这就是面向对象的实例和方法的思想,一定都不奇怪,反倒当你深入面向对象后,才会认为凭空出现的全局方法是很突兀的。
    shyling
        15
    shyling  
       Feb 4, 2016 via iPad
    @shoaly 你说这个优点 php 好像想甩掉呢。。
    yuriko
        16
    yuriko  
       Feb 4, 2016
    java 语法讲究规范性,这条输出语句很清楚的表明了操作内容
    System 是个类,然后我们找到了其中的 out 这个静态的 PrintStream 实例,然后通过其 PrintStream 的 println 方法进行打印

    和其他语言不同在于, Java 并没有为输出语句做一些特别的优化来减少调用时的麻烦,这和 Java 的语法风格不符
    同时你可以试试只使用 System.out 来获取输出流做一些其他奇奇怪怪的事情
    shyling
        17
    shyling  
       Feb 4, 2016 via iPad   ❤️ 1
    @spance 把一个 print 方法加到 java.lang.Object 里,这样就不突兀了
    Zzzzzzzzz
        18
    Zzzzzzzzz  
       Feb 4, 2016
    来, scala 和 groovy 选一个吧.
    uxstone
        19
    uxstone  
       Feb 4, 2016
    所以习惯了 java ,
    再看 js 的代码,那叫一个痛苦。
    tobyxdd
        20
    tobyxdd  
       Feb 4, 2016
    这叫 OOP
    spance
        21
    spance  
       Feb 4, 2016
    @shyling Object 是一个 root 级抽象描述,它怎么会有 print 这样的行为?好比我们给 Car 对象定义一个 makeLove()是不是很不合逻辑?
    System.out 这个对象代表了标准输出流,它有动作行为可以提供给你, write,print... 让它 print 它就输出显示了,里面是怎么一回事不需要知道,只知道你让他 print 一下他就能输出 /显示,并且这是他自己的动作,这就可以了。
    leohuachao
        22
    leohuachao  
       Feb 4, 2016
    面向对象就是这么写的,要弄短也只是个语法糖而已
    shyling
        23
    shyling  
       Feb 4, 2016 via iPad
    @spance 举例有点没节操→_→还好吧,我只是说一个解决方案。想想 java.lang.Object 里的方法, wait/notify/notifyAll/equals/hashCode 从逻辑上不一定要位于 Object 上呀。例如放到 Waitable,Comparable,Hashable 也是可以的呀。像 golang ,内置了 println ,还可以用 fmt.Println
    spance
        24
    spance  
       Feb 4, 2016
    @shyling 好吧,换个温柔点的比方,面向对象世界里面我们就像是女娲,不断的制造对象,并吩咐他们做 xxx ,他们再去吩咐别人 xxx ,然后所有对象都在 xxxing ,那么程序就执行起来了。
    Object 是个基类,让他具有一些普世的、共通的行为,以便所有对象都有这个行为,当然也能做很多个接口去仔细的描述归类这些行为,但是也要在过度抽象和具象之间有个平衡,抽象的太狠了效率不高而且也不好用了,抽象的不够又不足以承载面向对象的思想,所以还是要平衡。
    shyling
        25
    shyling  
       Feb 4, 2016 via iPad
    @spance 嗯,是这样子没错←_←,不过有时设计语言也要考虑性能啊,开发者的原因。就像上面说的基本类型不是对象, int 和 Integer 的关系,啦啦啦
    zonghua
        26
    zonghua  
       Feb 4, 2016 via iPhone
    @echo1937 sy   so
    aivier
        27
    aivier  
       Feb 4, 2016
    Console.WriteLine(); 这个也挺麻烦的...还好 VS 有自动补全
    mfaner
        28
    mfaner  
       Feb 4, 2016
    哪有用那么频繁的
    WispZhan
        29
    WispZhan  
       Feb 4, 2016
    我来传播 kotlin,快来信仰 jetbrains 神教。
    kaneg
        30
    kaneg  
       Feb 4, 2016   ❤️ 1
    等你写过很多 Java 代码,你就会逐渐发现正规代码中几乎不会用到 System.out 来输出,而是用 log.xxx ,否则你会被 code reviewer 批。
    况且 IDE 都有快捷语句,如 IDEA ,用 sout 即可
    zaishanfeng
        31
    zaishanfeng  
       Feb 4, 2016 via Android
    java 是离了 ide 活不下去的语言 还是 echo print 爽
    Sumkor
        32
    Sumkor  
       Feb 4, 2016
    对我来说就是 syso
    jydeng
        33
    jydeng  
       Feb 4, 2016
    system.console.writeline("blabla") ,我 C#也挺长的。
    saximoer
        34
    saximoer  
       Feb 4, 2016
    syso
    sout

    基本都只这么打了。。
    onice
        35
    onice  
       Feb 4, 2016
    IDE 里面可以 syso 然后加上自动补全的快捷键。

    System.out.println("");这个因为 Java 默认不装载 System 包,所以要写全包名。

    在 Java 头部 import 下 System.out 包,程序里就可以直接用 Println 相关方法输出了。

    不过。。。一般没人这么干,都是直接写的 Println 的全路径, IDE 很方便了。。。
    Narcissu5
        36
    Narcissu5  
       Feb 5, 2016   ❤️ 1
    真正项目里面一般都是 logger.info(.....),print 实际上用的很少

    实际上 print 语句除了学习和技术验证之外并没有什么卵用
    woai110120130
        37
    woai110120130  
       Feb 5, 2016
    可读性好 语义清晰
    wizardforcel
        38
    wizardforcel  
       Feb 5, 2016 via Android
    因为 java 没有别名机制。

    c++和 c#都有 using 。
    woai110120130
        39
    woai110120130  
       Feb 5, 2016
    这就是 java 的简单之美
    charlie21
        40
    charlie21  
       Feb 5, 2016
    icedx
        41
    icedx  
       Feb 5, 2016
    @yuriko 解释的很好
    我觉得还有更丧病的, 比如 equals()
    nikubenki
        42
    nikubenki  
       Feb 5, 2016 via iPhone
    就 syso 嘛,有什么长的
    bombless
        43
    bombless  
       Feb 5, 2016
    Java 不是适合 hacker 的语言,不过好歹在学院派和工程派都能找到支持者, 233
    我觉得要求短的话 Perl 也许会合某些人胃口 233
    yuriko
        44
    yuriko  
       Feb 6, 2016
    @icedx 还有 campareTo 这种……私以为 toString 算是 Java 少有的语法糖了,应该废除 [逃~


    @bombless 的确, Java 的确不适合很多 hacker 要炫酷便捷开发的要求;同时由于其语言的严谨性和带来的可维护性,受大量传统工程开发的青睐,这也是为什么 Java 在企业级应用里常见的原因吧
    icedx
        45
    icedx  
       Feb 6, 2016
    @yuriko toString 不就是__str__()么 (逃
    wittyfox
        46
    wittyfox  
       Feb 6, 2016 via Android
    那是你没有见到这个

    `com.sun.java.swing.plaf.nimbus.InternalFrameInternalFrameTitlePaneInternalFrameTitlePaneMaximizeButtonWindowNotFocusedState`
    yuriko
        47
    yuriko  
       Feb 6, 2016
    @icedx 我是指 toString 的隐式转换,几个类的实例在做字符串拼接的时候会直接转换 1+""这种……
    icedx
        48
    icedx  
       Feb 6, 2016
    @yuriko 这么说的话我感觉其实 toString 很好用
    yuriko
        49
    yuriko  
       Feb 6, 2016
    @icedx 而且调试的时候,重写了 toString , ide 就能迅速的打印里面的信息了
    zonghua
        50
    zonghua  
       Feb 6, 2016 via iPhone
    @wittyfox Spring 里面有一个方法名 108 个字符
    icedx
        51
    icedx  
       Feb 6, 2016
    @yuriko 66666666 居然还能这么玩
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5365 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 145ms · UTC 08:52 · PVG 16:52 · LAX 01:52 · JFK 04:52
    ♥ Do have faith in what you're doing.