屎山代码一则

77 天前
 winterbells

大家都知道 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 了,然后报错==

2607 次点击
所在节点    Kotlin
16 条回复
ghost024
77 天前
哈哈哈哈哈,要么改反射,要么加入:)
nuonuojump
77 天前
挺先进的代码,我都没想过还能在销毁的时候 手动做这种类型的 gc 。挺先进的。
easylee
77 天前
如此一说,Java 里面是不是也能这么操作?有实战案例吗!
htxy1985
77 天前
手动设置为 null 这种做法只在零几年的代码里见过,还有人专门写了英文注释,感觉是跟国际水准接轨 /doge
beisilu
76 天前
盲猜这个是在已有屎山上拉的
盲猜楼主还要再拉一坨
winterbells
76 天前
@ghost024 改是不会改的,能想象无止境的追问改这个有什么意义


@beisilu 不拉了,我选择加入。万一出了问题还得我改
akiakise
76 天前
简直就是在用 java 的方式写 kotlin ,jb 辛辛苦苦加的那么多语法糖是一口不吃啊
winterbells
76 天前
@akiakise 有些地方还是吃的,但绝大多数代码都是 Java 的风格

另外我们是 Android ,官方组件几乎不用的。viewmodel 、lifecycler 什么的。自己搓了一套 lifestate ,从来没去研究过到底解决了什么问题,难懂反正
leegradyllljjjj
76 天前
java 就是上世纪的狗屎语言,不少遗老遗少还当宝,自诩为 java 专家称号
iseki
75 天前
这已经不是什么语言的问题了😩不过我大概猜测,是不是哪里一直持有这个 activity 的引用啊,要不然怎么会想到干这种事
winterbells
75 天前
@iseki 乱七八糟的引用也是原因之一,但是这个回收代码一开始就有
lisongeee
75 天前
```kt
if (obj?.s == null) return
obj!!.s
```
我一般不会这么写,我一般写的是
```kt
val s = obj?.s ?: return
```
这样才能保证线程安全,最上面那种情况我只会在 js 里写,只有在 js 里这种用法才是线程安全的 (瞎写的 getter 不算)
winterbells
75 天前
@lisongeee 我这边看到两种写法都有,更多的是
val o = obj ?: return

coroutine / callback{
o.xxx
}

这里还拿了个引用
lisongeee
75 天前
val s 是线程安全的,obj!!.s 是线程不安全的

如果 obj 是 val 的,并且 obj 的 s 也是 val 声明的,那 val s 和 obj.s 没区别

如果你的代码风格尽量向 immutable 靠近,那能避免很多错误,当然这是我的前端思维,我不知道是否适合后端

可以了解一下 kotlinx-collections-immutable 这个库
xuanbg
75 天前
@leegradyllljjjj 这个和语言有什么关系啊,你给个你心目中最好的语言,我负责给你找一堆的屎来喂给你
winterbells
75 天前
@lisongeee 没毛病,安卓也是前端😄
obj.s 可能是 val 也可能是 var 也可能是方法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1077764

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX