关于 Java Final 关键字的用法请教 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
huyanqi

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

  •  
  •   huyanqi Aug 31, 2016 2345 views
    This topic created in 3525 days ago, the information mentioned may be changed or developed.

    今天在查看 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 replies    2016-09-01 08:07:08 +08:00
    sorra
        1
    sorra  
       Aug 31, 2016
    我推测是如果抛异常就两个都不赋值。否则会出现一个有值一个没值的情况。
    话说,竟然悄悄吞异常?
    cocalrush
        2
    cocalrush  
       Aug 31, 2016 via Android
    感觉似乎就是为了处理抛异常时, mmlnStream 被初始化为指向异常的对象。然而并没有处理异常 是不是忘记了。
    ovear
        3
    ovear  
       Aug 31, 2016
    因为不这么写。。编译过不去。。。可能尚未初始化变量。。。
    SoloCompany
        4
    SoloCompany  
       Aug 31, 2016 via iPhone
    注释即原因
    21grams
        5
    21grams  
       Aug 31, 2016 via Android
    因为初始化语句有可能因为异常而未被执行
    Cbdy
        6
    Cbdy  
       Aug 31, 2016 via Android   2
    因为 final 修饰的“变量”必须初始化。在声明、初始化块、构造方法中初始化都可以。 try 语句可能导致初始化失败,所以先给一个 null 。换成 if 啥的可能导致空指针的都要做一个预防。如果不想这样做,把置 null 放 finally 处理也是可以的(建议试试看)。
    cocalrush
        7
    cocalrush  
       Sep 1, 2016 via Android
    @Cbdy 这个说得对
    baozijun
        8
    baozijun  
       Sep 1, 2016
    @Cbdy 非常感谢,以前用 final 都是直接赋值,现在看来还得看看书籍查缺补漏。
    bqbkbz
        9
    bqbkbz  
       Sep 1, 2016   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 ever constructor of the class in which it is declared; otherwise a compile-time error occurs.
    About     Help     Advertise     Blog     API     FAQ     Solana     953 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 51ms UTC 22:43 PVG 06:43 LAX 15:43 JFK 18:43
    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