yuntong
V2EX  ›  Java

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

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

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

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

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

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

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

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

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

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

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

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


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

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