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

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

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

    第一种风格

    ...
    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,另外两个写……
    lizon
        3
    lizon  
       2018-01-23 13:34:42 +08:00
    遵循团队规范
    自己的项目随意,反正 IDE 能跳转,怎么写是个人审美问题
    boywang004
        4
    boywang004  
       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
    爱省略不省略,风格统一,自圆其说即可。
    ZSeptember
        17
    ZSeptember  
       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   ·   实用小工具   ·   972 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:53 · PVG 04:53 · LAX 12:53 · JFK 15:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.