Cbdy
V2EX  ›  Java

作为良好的 Java 编码规范,可省略的 this 该不该省略?

  •  
  •   Cbdy · Jan 23, 2018 · 9370 views
    This topic created in 3045 days ago, the information mentioned may be changed or developed.

    第一种风格

    ...
    public WebServer() {
        vertx = Vertx.vertx();
        router = Router.router(vertx);
    }
    
    public void start(int port) {
        vertx.createHttpServer().requestHandler(router::accept).listen(port);
    }
    
    public void start() {
       start(8080);
    }
    ...
    

    第二种风格

    ...
    public WebServer() {
        this.vertx = Vertx.vertx();
        this.router = Router.router(this.vertx);
    }
    
    public void start(int port) {
        this.vertx.createHttpServer().requestHandler(this.router::accept).listen(port);
    }
    
    public void start() {
       this.start(8080);
    }
    ...
    

    当然还有一种混搭风

    26 replies    2019-03-21 08:54:21 +08:00
    rim99
        1
    rim99  
       Jan 23, 2018 via Android
    我喜欢不省略,可以明确的看出这是个实例属性
    coolcfan
        2
    coolcfan  
       Jan 23, 2018 via Android
    看具体代码规范,比如有的项目会要求把所有 private field 名字以下划线开头,而 protected 和 public 的不用,此时 private 的就不写 this,另外两个写……
    x8
        3
    x8  
       Jan 23, 2018
    遵循团队规范
    自己的项目随意,反正 IDE 能跳转,怎么写是个人审美问题
    vela
        4
    vela  
       Jan 23, 2018
    我的原则是,以提高可读性为优先。
    大多数情况下,如果省略和不省略是相同含义的话,倾向是省略,减少冗余,以便减少阅读干扰。除非特殊场景下需要强调的。
    具体到 this 这个地方,一般尽量避免本地变量遮盖 field 变量(我们的 checkstyle 配置是除了 setter 以外如果出现遮盖直接检查失败),就避免了 99%必须要用到 this 的场景。
    yulitian888
        5
    yulitian888  
       Jan 23, 2018
    如果使用某些重构工具\插件的情况下,显式声明会更安全,因为工具不一定能准确识别 this 还是 base,甚至继承好几层的情况下 base 都不足以表达了,你敢不加前缀?
    aristotll
        6
    aristotll  
       Jan 23, 2018
    不省略 个人认为
    paragon
        7
    paragon  
       Jan 23, 2018
    不用 跟匈牙利命名法一样 现代 IDE 都会标记颜色的,
    TangMonk
        8
    TangMonk  
       Jan 23, 2018 via Android
    Bigears
        9
    Bigears  
       Jan 23, 2018
    好习惯是不省略
    mosliu
        10
    mosliu  
       Jan 23, 2018
    我一般习惯 :
    属性加,容易识别和区分 即 this.vertx = Vertx.vertx();
    而函数省略。即 start(8080);

    所谓的混搭风。
    WispZhan
        11
    WispZhan  
       Jan 23, 2018
    带"this."好,成员域一目了然。
    xia0pia0
        12
    xia0pia0  
       Jan 23, 2018
    不省略好,这样用其他开发语言的人一眼也能看出来。
    doubleflower
        13
    doubleflower  
       Jan 23, 2018
    不省略可读性更高
    Tneciv
        14
    Tneciv  
       Jan 23, 2018
    习惯了 this 和 super 都不省略
    noe132
        15
    noe132  
       Jan 23, 2018 via Android
    写 JavaScript 表示类方法都要自己在方法体第一行加
    const self = this
    然后所有实例属性用 self 访问
    yaoliyc
        16
    yaoliyc  
       Jan 23, 2018 via iPhone   ❤️ 1
    爱省略不省略,风格统一,自圆其说即可。
    looplj
        17
    looplj  
       Jan 23, 2018
    省略,看着烦。
    searene
        18
    searene  
       Jan 23, 2018
    对于这种字段 intellij 里面会用特别的颜色标出,所以即使不加也不影响代码的阅读,所以我觉得加不加都无所谓。
    evilWill
        19
    evilWill  
       Jan 23, 2018
    除了自动生成的 setting() 中带 this 其余都省略
    workwonder
        20
    workwonder  
       Jan 23, 2018 via Android
    不带 this 感觉像方法内部的局部变量
    zts1993
        21
    zts1993  
       Jan 23, 2018
    其实这种问题不会影响代码质量。。至少不是不属于关键问题
    毕竟很多时候不写 this 是错误的。
    Ziav
        22
    Ziav  
       Jan 23, 2018
    不省略。
    20015jjw
        23
    20015jjw  
       Jan 24, 2018 via Android
    用 m
    laxenade
        24
    laxenade  
       Jan 24, 2018
    写 this 便于 IDE 补全(雾
    corningsun
        25
    corningsun  
       Jan 24, 2018   ❤️ 1
    特别去找了一下。

    Google Java 编程规范 和 阿里巴巴 Java 编程规范 都没有提到这个问题。。。。

    但是从一些示例和开源代码,发现 混搭的还是多

    Oracle Java Language Specification: https://docs.oracle.com/javase/specs/jls/se9/html/jls-15.html#jls-15.8.3


    阿里巴巴 Java 开发手册(纪念版): https://yq.aliyun.com/articles/69327


    Doubble 源码:
    https://github.com/alibaba/dubbo/blob/master/dubbo-filter/dubbo-filter-cache/src/main/java/com/alibaba/dubbo/cache/filter/CacheFilter.java



    JDK 源码:String
    ```java
    public String(String original) {
    this.value = original.value;
    this.hash = original.hash;
    }
    public int length() {
    return value.length;
    }
    ```

    Google Java Style Guide: https://google.github.io/styleguide/javaguide.html

    总结下:
    构造器和 setter 方法中使用 this
    其他方法中可以不用
    zhazi
        26
    zhazi  
       Mar 21, 2019 via Android
    构造和 g&s 有 this 因为是生成的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2659 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 100ms · UTC 15:38 · PVG 23:38 · LAX 08:38 · JFK 11:38
    ♥ Do have faith in what you're doing.