大家都知道 Kotlin 有空安全
var s: String 代表不为空
var s: String? 代表可为空
奇葩操作来了,在我接手之前,除了绝大部分的基本变量,其余所有变量都是 String?、Objxx?
使用的时候:
if (S != null) print(s) else throw Exption("s shouldn't be null")
或者:
if (obj?.s == null) return
obj!!.s
一开始很好奇这个脑残写法是怎么来的
然后遇到了一个 crash 我找到根源了。我写的代码里没有用 String? ,但是却报了 NPE ,赋值的地方都查过了,不存在 null 。最终不断地调试发现每次页面 onDestory()的时候会有个反射递归地将所有变量和变量里的变量都设置成 null (说是在手动 GC…)。又因为魔改了生命周期+协程,读取变量的时候已经是 null 了,然后报错==
!
1
ghost024 81 天前
哈哈哈哈哈,要么改反射,要么加入:)
|
2
nuonuojump 81 天前
挺先进的代码,我都没想过还能在销毁的时候 手动做这种类型的 gc 。挺先进的。
|
3
easylee 81 天前
如此一说,Java 里面是不是也能这么操作?有实战案例吗!
|
4
htxy1985 81 天前 2
手动设置为 null 这种做法只在零几年的代码里见过,还有人专门写了英文注释,感觉是跟国际水准接轨 /doge
|
5
beisilu 80 天前
盲猜这个是在已有屎山上拉的
盲猜楼主还要再拉一坨 |
6
winterbells OP |
7
akiakise 80 天前 via iPhone
简直就是在用 java 的方式写 kotlin ,jb 辛辛苦苦加的那么多语法糖是一口不吃啊
|
8
winterbells OP @akiakise 有些地方还是吃的,但绝大多数代码都是 Java 的风格
另外我们是 Android ,官方组件几乎不用的。viewmodel 、lifecycler 什么的。自己搓了一套 lifestate ,从来没去研究过到底解决了什么问题,难懂反正 |
9
leegradyllljjjj 80 天前
java 就是上世纪的狗屎语言,不少遗老遗少还当宝,自诩为 java 专家称号
|
10
iseki 79 天前 via Android
这已经不是什么语言的问题了😩不过我大概猜测,是不是哪里一直持有这个 activity 的引用啊,要不然怎么会想到干这种事
|
11
winterbells OP @iseki 乱七八糟的引用也是原因之一,但是这个回收代码一开始就有
|
12
lisongeee 79 天前
```kt
if (obj?.s == null) return obj!!.s ``` 我一般不会这么写,我一般写的是 ```kt val s = obj?.s ?: return ``` 这样才能保证线程安全,最上面那种情况我只会在 js 里写,只有在 js 里这种用法才是线程安全的 (瞎写的 getter 不算) |
13
winterbells OP |
14
lisongeee 79 天前
val s 是线程安全的,obj!!.s 是线程不安全的
如果 obj 是 val 的,并且 obj 的 s 也是 val 声明的,那 val s 和 obj.s 没区别 如果你的代码风格尽量向 immutable 靠近,那能避免很多错误,当然这是我的前端思维,我不知道是否适合后端 可以了解一下 kotlinx-collections-immutable 这个库 |
15
xuanbg 79 天前
@leegradyllljjjj 这个和语言有什么关系啊,你给个你心目中最好的语言,我负责给你找一堆的屎来喂给你
|
16
winterbells OP @lisongeee 没毛病,安卓也是前端😄
obj.s 可能是 val 也可能是 var 也可能是方法 |