V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
huyanqi
V2EX  ›  问与答

关于 Java Final 关键字的用法请教

  •  
  •   huyanqi · 2016-08-31 19:20:17 +08:00 · 1825 次点击
    这是一个创建于 3008 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天在查看 Google 的 Android API ,关于蓝牙相关文档。发现下面这个写法比较奇怪,很好奇其中的用意,请大神们点评。

    private class ConnectedThread extends Thread {

    private final BluetoothSocket mmSocket;
    private final InputStream mmInStream;
    private final OutputStream mmOutStream;
    
    public ConnectedThread(BluetoothSocket socket) {
        mmSocket = socket;
        InputStream tmpIn = null;
        OutputStream tmpOut = null;
    
        // Get the input and output streams, using temp objects because
        // member streams are final
        try {
            tmpIn = socket.getInputStream();
            tmpOut = socket.getOutputStream();
        } catch (IOException e) { }
    
        mmInStream = tmpIn;
        mmOutStream = tmpOut;
    }
    

    在构造函数里面,给 mmInStream 赋值的时候为何要用 tmpIn 的局部变量赋值,而不是直接只用 mmInStream = socket.getInputStream(); 虽然有注释,但还是没写到核心,这种写法有啥好处,大神们快来解答解答...

    9 条回复    2016-09-01 08:07:08 +08:00
    sorra
        1
    sorra  
       2016-08-31 21:11:44 +08:00
    我推测是如果抛异常就两个都不赋值。否则会出现一个有值一个没值的情况。
    话说,竟然悄悄吞异常?
    cocalrush
        2
    cocalrush  
       2016-08-31 21:42:55 +08:00 via Android
    感觉似乎就是为了处理抛异常时, mmlnStream 被初始化为指向异常的对象。然而并没有处理异常 是不是忘记了。
    ovear
        3
    ovear  
       2016-08-31 21:57:20 +08:00
    因为不这么写。。编译过不去。。。可能尚未初始化变量。。。
    SoloCompany
        4
    SoloCompany  
       2016-08-31 22:07:35 +08:00 via iPhone
    注释即原因
    21grams
        5
    21grams  
       2016-08-31 22:17:42 +08:00 via Android
    因为初始化语句有可能因为异常而未被执行
    Cbdy
        6
    Cbdy  
       2016-08-31 23:20:49 +08:00 via Android   ❤️ 2
    因为 final 修饰的“变量”必须初始化。在声明、初始化块、构造方法中初始化都可以。 try 语句可能导致初始化失败,所以先给一个 null 。换成 if 啥的可能导致空指针的都要做一个预防。如果不想这样做,把置 null 放 finally 处理也是可以的(建议试试看)。
    cocalrush
        7
    cocalrush  
       2016-09-01 00:17:33 +08:00 via Android
    @Cbdy 这个说得对
    baozijun
        8
    baozijun  
       2016-09-01 00:31:15 +08:00
    @Cbdy 非常感谢,以前用 final 都是直接赋值,现在看来还得看看书籍查缺补漏。
    zhaohui318
        9
    zhaohui318  
       2016-09-01 08:07:08 +08:00   ❤️ 1
    http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.3.1.2

    A blank final instance variable must be definitely assigned at the end of every constructor of the class in which it is declared; otherwise a compile-time error occurs.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5647 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:29 · PVG 11:29 · LAX 19:29 · JFK 22:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.