首页   注册   登录
 firefffffffffly 最近的时间轴更新
ONLINE

firefffffffffly

V2EX 第 97742 号会员,加入于 2015-02-15 15:22:39 +08:00
今日活跃度排名 715
firefffffffffly 最近回复了
53 天前
回复了 xujinkai 创建的主题 程序员 大家工作中都遇到过哪些神奇的代码
for(int i=0;i<3;i++) {
switch(i) {
case 0:
doSth();
break;
case 1:
doSth2();
break;
case 2:
doSth3();
break;
}
}
花钱找声乐老师学是一个很有用的办法,现在提供这个服务的机构个人挺多的。免费教学资源的话推荐去 youtube 或 bilibili 搜嘎老师的视频,讲解比较通俗易懂而且真的很有用。
http2 多路复用解决了这个问题
111 天前
回复了 hackingwu 创建的主题 程序员 反射性能差这么多,有办法提高吗?
性能有差距,但是应该不会像例子里这么大, 这段代码做 benchmark 不太严谨,比如第二段代码可能会被 jit 优化到没有。
依照这个测试 https://dzone.com/articles/the-performance-cost-of-reflection 不包含具体逻辑的情况下测试大约是差 10 倍。
@gramyang

每个接触 concurrenthashmap 的人都踩过的坑 ×
不理解线程安全的人踩过的坑 √

increase1 的线程不安全发生在 int value = oldTable.getI(); oldTable.setI(value + 1);这两句上
increase2 使用 CAS 乐观锁的方式解决了 increase1 里线程不安全的问题,你也可以用传统的 synchornized 悲观锁同样解决问题。
无论怎样都没有涉及到 CHM 的任何问题。
1. Saved instance state 也是基于序列化与反序列化的磁盘访问,与设计良好的自定义持久化缓存性能应该没有区别,自定义持久化性能问题主要来自于持久化方式的设计问题。

2. 自定义持久化的生命周期是比 Saved instance state 要长的,可以做到 activity 反复 finish/start 之后也能共享数据,这个场景是不能被 SavedInstanceState 取代的,不过这个应该不是这篇文章的重点。

3. 由于 SavedInstanceState 的性能问题,android 官方推荐将页面状态拆分,使用 ViewModel 模式内存存储绝大部分状态,小部分关键状态交给 SavedInstanceState 保存。

4. 大部分状态保持问题并非是使用错了方式,而是没有理清页面上所存在的状态,导致状态只有一部分被恢复 /保存,进而把整个页面逻辑导向到不可预测的方向。

5. 推荐其他开发者使用 android:configChanges 时,最好同时告诉他们可能存在的副作用: https://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange

以上内容均总结于官方文档( https://developer.android.com/topic/libraries/architecture/saving-states
粗略思考了一下,我觉得问题关键在于 stateless 和 stateful 之间的区别,面向对象能写出 stateless 的代码,面向过程也可能被写成 stateful,纯函数式编程能真正做到 stateless,但函数式编程又会带来额外的难度。
125 天前
回复了 gramyang 创建的主题 Java ConcurrentHashMap 的使用问题
建议把 exception 信息贴出来,这样能轻松确定是 map 为空还是传入的 key 值为空。
从描述的 exception 来看 player 最不可能为空,因为这样的话报错 message 和 traces 里是不会包含 remove 相关内容的,因为在 player.getNum()时就会报错了,remove 函数还没有入栈。
key 值为空的情况,就是 player.getNum()的结果为 null,这个 player 内部属性需要再检查一下是否有多线程修改。
我的理解框架可以做这种通用逻辑,但是很重要的一点是框架绝不能隐藏或者掩盖这些逻辑产生的信息,越重要的信息就越应该越明显的暴露给业务层,这样才能保证调用方对框架接口产生足够清晰的预期。

比如你的引导框架有 show()/hide()两个接口,这时候如果你将 show()中加入只能展示一次的逻辑,这时 show()接口是否真正生效,就应该是非常重要的信息(在编写框架时,不能提前假设调用方用不到这个信息),暴露这个信息就很多种方式,比如如下几个,越往下的提示越明显。

boolean show() 用返回值是否成功 show

initShowType(int type, int maxTimes)和 show(type), 提供提前初始化引导的接口显式提示这个逻辑

show(int maxTimes) 用显式参数让调用方察觉这个逻辑存在

show() throw AlreadyShownException 最明显的提示,迫使调用方必须考虑这个情况

具体的理想实现方法还要同时参考很多其他的设计原则,而且也依赖具体场景。比如你暴露了过多的信息,就会违反最小知识原则,让业务层需要关注太多不必要信息。
关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1404 人在线   最高记录 5043   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.3 · 11ms · UTC 17:23 · PVG 01:23 · LAX 10:23 · JFK 13:23
♥ Do have faith in what you're doing.