作为良好的 Java 编码规范,可省略的 this 该不该省略? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Cbdy
V2EX    Java

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

  •  
  •   Cbdy 2018-01-23 13:21:56 +08:00 9017 次点击
    这是一个创建于 2830 天前的主题,其中的信息可能已经有所发展或是发生改变。

    第一种风格

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

    所谓的混搭风。
    WispZhan
        11
    WispZhan  
       2018-01-23 15:06:46 +08:00
    带"this."好,成员域一目了然。
    xia0pia0
        12
    xia0pia0  
       2018-01-23 15:17:30 +08:00
    不省略好,这样用其他开发语言的人一眼也能看出来。
    doubleflower
        13
    doubleflower  
       2018-01-23 16:36:53 +08:00
    不省略可读性更高
    Tneciv
        14
    Tneciv  
       2018-01-23 16:43:06 +08:00
    习惯了 this 和 super 都不省略
    noe132
        15
    noe132  
       2018-01-23 18:12:53 +08:00 via Android
    写 Javascript 表示类方法都要自己在方法体第一行加
    const self = this
    然后所有实例属性用 self 访问
    yaoliyc
        16
    yaoliyc  
       2018-01-23 18:29:35 +08:00 via iPhone   1
    爱省略不省略,风格统一,自圆其说即可。
    looplj
        17
    looplj  
       2018-01-23 18:52:51 +08:00
    省略,看着烦。
    searene
        18
    searene  
       2018-01-23 19:38:13 +08:00
    对于这种字段 intellij 里面会用特别的颜色标出,所以即使不加也不影响代码的阅读,所以我觉得加不加都无所谓。
    evilWill
        19
    evilWill  
       2018-01-23 19:39:40 +08:00
    除了自动生成的 setting() 中带 this 其余都省略
    workwonder
        20
    workwonder  
       2018-01-23 20:06:24 +08:00 via Android
    不带 this 感觉像方法内部的局部变量
    zts1993
        21
    zts1993  
       2018-01-23 20:19:52 +08:00
    其实这种问题不会影响代码质量。。至少不是不属于关键问题
    毕竟很多时候不写 this 是错误的。
    Ziav
        22
    Ziav  
       2018-01-23 20:19:53 +08:00
    不省略。
    20015jjw
        23
    20015jjw  
       2018-01-24 05:48:21 +08:00 via Android
    用 m
    laxenade
        24
    laxenade  
       2018-01-24 08:01:48 +08:00
    写 this 便于 IDE 补全(雾
    corningsun
        25
    corningsun  
       2018-01-24 14:30:14 +08:00   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  
       2019-03-21 08:54:21 +08:00 via Android
    构造和 g&s 有 this 因为是生成的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4856 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 09:41 PVG 17:41 LAX 02:41 JFK 05:41
    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