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

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

  •  
  •   yuntong · 2016-02-04 15:11:25 +08:00 · 7445 次点击
    这是一个创建于 2997 天前的主题,其中的信息可能已经有所发展或是发生改变。

    System.out.println("");

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

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

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

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

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

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

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

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

    基本都只这么打了。。
    onice
        35
    onice  
       2016-02-04 23:49:19 +08:00
    IDE 里面可以 syso 然后加上自动补全的快捷键。

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

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

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

    实际上 print 语句除了学习和技术验证之外并没有什么卵用
    woai110120130
        37
    woai110120130  
       2016-02-05 08:57:24 +08:00
    可读性好 语义清晰
    wizardforcel
        38
    wizardforcel  
       2016-02-05 12:24:35 +08:00 via Android
    因为 java 没有别名机制。

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


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

    `com.sun.java.swing.plaf.nimbus.InternalFrameInternalFrameTitlePaneInternalFrameTitlePaneMaximizeButtonWindowNotFocusedState`
    yuriko
        47
    yuriko  
       2016-02-06 13:38:18 +08:00
    @icedx 我是指 toString 的隐式转换,几个类的实例在做字符串拼接的时候会直接转换 1+""这种……
    icedx
        48
    icedx  
       2016-02-06 14:07:04 +08:00
    @yuriko 这么说的话我感觉其实 toString 很好用
    yuriko
        49
    yuriko  
       2016-02-06 14:08:23 +08:00
    @icedx 而且调试的时候,重写了 toString , ide 就能迅速的打印里面的信息了
    zonghua
        50
    zonghua  
       2016-02-06 14:12:20 +08:00 via iPhone
    @wittyfox Spring 里面有一个方法名 108 个字符
    icedx
        51
    icedx  
       2016-02-06 15:36:35 +08:00
    @yuriko 66666666 居然还能这么玩
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   898 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 21:18 · PVG 05:18 · LAX 14:18 · JFK 17:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.