Skip to content

Ider

沉淀我所学习,累积我所见闻,分享我所体验

Primary Navigation Menu
Menu
  • Home
  • About Ider
    • Who Ider?
    • Why Ider?
    • How Ider?
    • Where Ider?
    • What Ider?
2020-03-12
12 March
On March 12, 2020
In Data Structures(数据结构), Knowledge Base(心得笔库), Language Tips(语言初试), Mobile Development(移动开发)

基础数据类型的包装类的内存大小

谈到 Java 的基础数据类型(Primitive Data Types),可以找到很多关于其种类以及内存大小的文章。基础数据类型对应的包装类(Wrapper Classes)也会介绍自动装箱(Autoboxing)和拆箱(Unboxing),以及带来的效率上的影响。但可能是因为Java一般所使用的环境都有比较充足的内存,似乎从来没有人讨论过每种包装类所占的内存大小以及对内存溢出可能造成的影响。

到了 Android 应用程序开发领域,由于设备硬件本身以及系统对各个程序在资源使用上的约束,就会出现很多特别的使用习惯,比如推荐使用Typedef来替代枚举类型(enum)来减少内存使用和方法数。因此关于基础数据类型的包装类所占内存大小就值得写篇博客来研究一下。

包装类所占内存大小

网上我找了很多计算类内存大小的方法,但是既然我是 Android 工程师,我就用 Android Studio 提供的 Memory Profiler 来查看内存使用情况

下边就是我用来做内存检查的类,它包含了所有基础数据类型和对于的包类型

[codesyntax lang=”java” lines=”normal”]

public class Primitives {
  boolean pBoolean;
  byte pByte;
  char pChar;
  double pDouble;
  float pFloat;
  int pInt;
  long pLong;
  short pShort;

  Boolean cBoolean;
  Byte cByte;
  Character cChar;
  Double cDouble;
  Float cFloat;
  Integer cInt;
  Long cLong;
  Short cShort;

  public Primitives() {}

  public Primitives(Void v) {
    cBoolean = false;
    cByte = 0;
    cChar = '\0';
    cDouble = 0.0;
    cFloat = 0.0f;
    cInt = 0;
    cLong = 0L;
    cShort = 0;
  }
}

[/codesyntax]

接着在 MainActivity 中创建两个 Primitives 类的字段:一个没有初始化对象类型,一个将所有对象类型初始化成默认值。然后运行程序,在 Android Studio 中打开 Profiler 查看内存时”Dump Java heap” 就可以看到这两个 Primitives 对象内存使用情况

从图中的结果可以看出如果对象的值是 null,那他们是不占用空间。在这一点上看,如果字段大部分时间都存的是空值或者以空值指代默认值,那相对比总是会被赋予默认值的基础数据类型在内存使用方面要好一些。

对于包装类,它们都比其对应基础数据类型要占用更多的内存空。仔细对比不难计算出他们的差别都是 8 bytes,正好是一个普通 Object 实例的大小。这也证明的包装类只是对基础数据类型的简单包装。

基础数据类型 包装类型
类型 大小 类型 大小
boolean 1 byte Boolean 9 bytes
byte 1 byte Byte 9 bytes
char 2 bytes Character 10 bytes
double 8 bytes Double 16 bytes
float 4 bytes Float 12 bytes
int 4 bytes Integer 12 bytes
long 8 bytes Long 16 bytes
short 2 bytes Short 10 bytes

所以,使用包装类不仅会有自动装箱和拆箱产生的效率上的影响,对内存的使用也有很大的影响。而 Android 的内存又是稀缺资源,所以 Android 库里多了特殊的数据类型来优化内存的使用,比如 SparseArray 替换以 int 为主键的 HashMap。
Read More →

2020-01-16
16 January
On January 16, 2020
In IT Products(数码产品)

下载Google Photos上的所有图片

Google Photos是我最爱的Google服务之一,它让我能把所有手机拍摄的图片、视频都保存到云端从而解放我手机的存储空间。上传之后,我还可以在电脑上的浏览器或移动设备的应用程序上按需要浏览和下载。而且因为我用的是 Pixel 手机可以上传原始尺寸也不算空间,因此我经常还会把单反相机拍的照片拷贝到手机中再上传来保证画质。
不过这一便捷性是建立在几个重要基础上的:好的网络;可以访问Google服务。去年年底回中国就碰到了无法使用Google Photos尴尬:Google被墙,VPN访问慢。那一刻让我深切感觉到还是本地的内容访问比较快。
于是回来的第一件事情就是想办法下载所有Google Photos里的备份到我的5TB的移动硬盘里。这样万一以后再配到类似的事情,或者Google Photos崩了,我还能找到过去的回忆。

从2014年开始用Google Photos到现在,我存了差不多100GB的照片,而Google Photos浏览页上一次最多只能下载500张照片。要想用愚公移山的方式去完成这任务,恐怕真的是子子孙孙无穷尽也。

好在Google的账号允许拥有者下载其在Google服务上使用的所有数据,其中也包括Google Photos:https://takeout.google.com/

勾选Google Photos之后还可以点击打开列表来选择想要下载的文件夹(按“上传日期”和“自建相册名”分)

然后在该页最后点击下一步进入压缩文档格式选择页面,最好选择大尺寸的文件,不然多个文件下载起来还是很麻烦的。

另一方面,我又想到个问题:以后我再来下载不是还会把之前下载过得又打包下载了一遍。于是我希望按年份来分组下载备份。可惜内容选择页面上没有提供过滤的方式让只勾选特定年份的选项,点击几百次来选中特定年份又不实际。

于是乎,我拿出所剩不多的JavaScript技能写了一段脚本来全选特定年份的图片文件夹:
[codesyntax lang=”javascript” lines=”normal”]

$0.querySelectorAll(':scope > div').forEach(function(option) {
    if (option.querySelector('label').textContent.startsWith('2015-')) {
        option.querySelector('input').click()
    }
})

[/codesyntax]

打开浏览器的开发者工具(Developer Tools)窗口,找到并选择包含所有选项框的html元素,再到指令控制台输入上边那段代码,就能完成想要的选择结果了。

以后只要根据实际需求来修改 if 里的条件来下载特定的年份或者自定义相册就可以了。

2020-01-01
01 January
On January 1, 2020
In Tangential Speech(漫话杂谈)

婚礼誓词

感谢上帝在2005的高二将你带到我的身边。你的睿智让我产生共鸣,你的幽默令我寻得知己,当然还有你美丽迷人的容颜深深印在我的脑海。因为有你让我找到了生命的意思,感受到时光的美好。
高中之后,我去了黄浦江边,你进了西子湖畔,我们两地分离却不能阻隔我们的联系,每天起床我们在短信中问候早安,每天睡前我们在电话机中互告晚安。
大学毕业,我独自去美国深造,你留在了浙大继续博士研究。我们日夜相隔,这份长相思让我们深刻地意识到与对方的感情是如此深刻,难以割离。
终于,2012年的夏天,你奔赴美国与我团聚。有了彼此在身边,我们的生活变得完美。
2017年,我们迎来了生命中新的转折点。儿子的降临让我们的家充满了笑声哭声吵闹声。一直以来,你对我和儿子的关心总是无微不至,肚饿送食,天冷加衣,生病喂药。你让整个家庭总是洋溢着幸福的喜悦。

曾经年少的我对你许下诸多誓言,在我们共同的努力下,而在这些誓言之后,你付出了更多:
我说我要跟你组建个共同的家 — 却是你让每个落脚的地方都有家的味道
我说我会挣钱养家你貌美如花 — 却是你不仅用美貌养了我眼,还用美食养了我的胃
我说我想看到你身着洁白婚纱 — 却也是你让我穿上这身正装站在你的面前

此刻,在亲朋好友和家人的见证下,我要再许下新的誓言:

你将是我生命中的伴侣和唯一的爱人。
我将珍惜我们的爱情,爱你,不论是现在,将来,还是永远。
我会信任你,尊敬你,
我将和你一起欢笑,一起哭泣。
我会忠诚的爱着你,
无论未来是好的还是坏的,是艰难的还是安乐的,我都会陪你一起度过。
无论准备迎接什么样的生活,我都会一直守护在这里。
就像我伸出手让你紧握住一样,
我会将我的生命交付于你。
所以请帮助我 我的主。
真诚的恳求上帝让我不要离开你,或是让我跟随在你身后
因为你到哪里我就会去到哪里,
因为你的停留所以我停留。
你爱的人将成为我爱的人,
你的主也会成为我的主。
你在哪里死去,我也将和你一起在那里被埋葬,
也许主要求我做的更多,但是不论发生任何事情,都会有你在身边

你愿意成为我的妻子,与我一同守护这份誓言吗?

2019-11-13
13 November
On November 13, 2019
In Article Collection(聚宝收藏)

科技公司的技术博客清单

最近在网上搜寻了下各大科技公司的技术博客,来寻找自己写作的素材和灵感,也借鉴一下格式和内容。于是发现大公司除了有宣传本家产品的网站,基本还有一个宣扬自身技术的博客站点。博客的内容可能不同,但基本都是围绕工程师的工作体验和技术分享。

公司设立技术博客的价值可能无法用数字去量化,但是它对技术社区的贡献肯定是很大的。对于公司本身,技术博客可以吸引更多对于技术有兴趣的人来加入公司;它可以让更多人了解公司技术栈从而减少新人招募后的培训成本;它可以接受外部对技术的建议和评价来提供更多选择和提升;它可以帮助工程师提高对外的个人形象进而变得更有归属感。

Facebook Family

先来看看自家公司技术博客,因为多个产品在不同事业部下,基本都有自己的技术博客站点,但是最大的还是主站。

  • Facebook: https://engineering.fb.com/
  • Oculus: https://developer.oculus.com/blog/
  • Instagram: https://instagram-engineering.com/
  • Facebook Messenger: https://blog.messengerdevelopers.com/

Medium.com Based

Medium.com是个博客发布平台,对于没有太多人力资源的中小型公司来说,把技术博客放在上边可以减少维护成本,也能获得更好的分发和推广。

  • Groupon: https://medium.com/groupon-eng
  • Yammer: https://medium.com/@YammerEng
  • Airbnb: https://medium.com/airbnb-engineering
  • Apollo: https://blog.apollographql.com/engine/home
  • Medium: https://medium.engineering/
  • Pinterest: https://medium.com/@Pinterest_Engineering
  • Cookpad: https://sourcediving.com/
  • Google: https://medium.com/google-developers
  • Netflix: https://medium.com/netflix-techblog
  • Doordash: https://blog.doordash.com/tagged/engineering
  • NextDoor: https://engblog.nextdoor.com/
  • Instacart: https://tech.instacart.com/

Hosted

当然,自己建立站点可以达到更好的个性化,也可以基于业务的扩张来做好分类。

  • Twitter: https://blog.twitter.com/engineering/en_us.html
  • Uber: https://eng.uber.com/
  • Slack: https://slack.engineering/
  • LinkedIn https://engineering.linkedin.com/
  • MicroSoft: https://engineering.microsoft.com/
  • Amazon: https://developer.amazon.com/blogs
  • Amazon AWS: https://aws.amazon.com/blogs/
  • Square: https://developer.squareup.com/blog/
  • Dropbox: https://blogs.dropbox.com/tech/
  • Booking.com: https://blog.booking.com/
  • Spotify: https://labs.spotify.com/
  • Yelp: https://engineeringblog.yelp.com/
  • Feedly: https://blog.feedly.com/
  • Zillow: https://www.zillow.com/tech/
  • Zynga:https://www.zynga.com/blogs/engineering
  • Reddit: https://redditblog.com/
  • Evernote: https://evernote.com/blog/category/tech/

Google

Google是个极大的例外,他们有太多太多核心技术产品,也让他们针对每个产品都针对性的技术博客。

  • https://youtube-eng.googleblog.com/
  • https://testing.googleblog.com/
  • https://android-developers.googleblog.com/
  • https://blogger.googleblog.com/
  • https://webmasters.googleblog.com/
  • https://gsuiteupdates.googleblog.com/

China

国内的科技公司似乎对技术博客不太感冒,我找了很久也只挖出寥寥数个。也许国内开始偏向使用微信公众号来做分享,比如“腾讯技术工程”和“阿里技术”。但我还是没有发现几个科技公司官方的技术型公众号。

  • 美团技术团队: https://tech.meituan.com/
  • 360: http://blogs.360.cn/
  • 阿里中间件:http://jm.taobao.org/
  • 百度 research http://research.baidu.com/Blog
  • 百度 EFE https://efe.baidu.com/
  • 阿里技术 https://102.alibaba.com/

Twitter Accounts

除了技术博客,对于比较简短的公告通知或者技术消息,大多技术公司会使用Twitter来发布。(我不是微博的用户,所以没有去找国内科技公司在微博上的账号,但是个人感觉微博偏向娱乐性,而非宣传技术的的地方。)

  • Facebook: https://twitter.com/fb_engineering
  • Instagram: https://twitter.com/instagrameng
  • Square: https://twitter.com/squareeng
  • Twitter: https://twitter.com/TwitterEng
  • AWS: https://twitter.com/awscloud
  • Android Developers: https://twitter.com/AndroidDev
  • Android: https://twitter.com/Android
  • Android Studio: https://twitter.com/androidstudio

 

最后,在我搜索这些资源的时候,Jeff Barr(AWS的布道者,也是AWS官方博客的创建者)恰巧发布了关于他自己15年来为AWS写博客的体会。在这边文章中可以找到他发的第一篇如同“Hello World”的文章是如此的简洁平淡,但是15后去看却又那么的回味十足。文章的后半部分,他分享的写作计划和想法也给予了我最好的启发和指导。

 

References:
  1. 50家硅谷IT公司技术博客-吐槽篇_36氪
  2. 国内各大互联网公司相关技术博客3.0版 (集合腾讯、阿里、百度、搜狐、新浪、网易、360等共29个) – carrotsss – CSDN博客
  3. 一系列国内外顶尖互联网公司的技术博客,晋升程序员必备! – 哔哩哔哩
  4. Best Company Engineering Blogs on Medium
  5. sumodirjo/engineering-blogs: A curated list of engineering blogs of startup and enterprise companies
2019-08-29
29 August
On August 29, 2019
In Data Structures(数据结构), Knowledge Base(心得笔库), Mobile Development(移动开发), Software Engineering(软件工程)

Gradle android-library 的各种坑

软件开发随着项目越来越大,我们会开始拆封出多个子项目(sub-project)或者库(library)来更好地独立维护。Android开发也不例外,我们也会需要创建各种库。如果使用Android Studio和Gradle,他们为我们提供了便捷的方式来创建libray。但是他们也带来了不少的维护问题,本文就来讲讲android-library里的坑来帮助大家避开。

android-library v.s. java-library

对于普通Android手机项目,我们有创建两种不同的Library可以选用: android-library 和 java-library

它们的gradle文件内容分别如下

[codesyntax lang=”groovy” lines=”normal” highlight_lines=”1″]

apply plugin: 'com.android.library'

android {
    // ...
}

dependencies {
    // ...
}

[/codesyntax]

[codesyntax lang=”groovy” lines=”normal” highlight_lines=”1″]

apply plugin: 'java-library'

sourceCompatibility = "7"
targetCompatibility = "7"

dependencies {
    // ...
}

[/codesyntax]

两种库在定义上的根本差别其实就是不同gradle plugin的使用。另一个小的差别就是android-library需要有一个 AndroidManifest.xml 文件,但它可以简单到只有一行内容(其中package的值通常是文件夹的路径)

[codesyntax lang=”xml” lines=”normal”]

<manifest package="com.ider.android.library" />

[/codesyntax]

使用上他们有一些差异,这些差异也是我们决定使用哪种Library的标准:

  • android-library 可以使用 Android API(比如Activity, Service等等),java-library 则不能使用
  • android-library 可以编译android资源文件(resources files),java-library 则无视这样内容
  • android-library 编译出 arr 文件,java-library编译出 jar 文件(本质上他们都是 zip 文件)
  • android-library 的配置可以包含各种编译类型(build variants)来控制,java-library没有那个复杂
  • android-library 可以依赖于另一个android-library 或者 java-library, java-library只能依赖于java-library而不能依赖于android-library

总体而言 android-library 基本是 java-library 的一个超集, 但 android-library 比 java-libray 使用起来要更加复杂一些。从上边的对比来看,对于Android的项目,因为我们不确定什么时候会需要调用 Android 的API,或者定义一下 Android 的资源内容。再者最后一条的约束也决定了创建的 java-library 要保证在整个依赖树(dependency tree)上要在接近叶子节点的位置。所以不如优先选择创建android-library,以免掉入之后改 build.gradle 的坑中。
Read More →

2018-12-16
16 December
On December 16, 2018
In English Posts(英文写作), Knowledge Base(心得笔库), Programming Life(程序人生)

Insights from 100 Interviews

As our interview status recorded, I just have conducted 100 interviews at Facebook. I never did batch interviews (multiple interviews a day in consecutive days), so I’m feeling really excited about this accumulative achievement.
On this wonderful milestone, I’d like to share some of my experience and tips about being interviewer at Facebook, I hope you found this helpful.

Benefits as an Interviewer

There is no doubt that interviews are critical for company growth. However, I want to tell you more about the personal growth and benefits of being an Android interviewer.

  • Improving my verbal and written English
    Since English is my second language, interview is a great way for me to practice. I repeat similar conversation during interview, and this exposure increases my confidence in my speech; by providing post-interview feedback, I have increased the speed and quality of my writing.
  • Expanding my social network
    I felt so great when some colleagues suddenly stopped me and asked me “do you know you interviewed me?” then our conversation started very naturally (although, I’m really sorry, I didn’t actually remember the interview).
  • Business travel for recruiting events
    I got a chance to go back to my alma mater to give recruiting talk, which I previously never imagined. However, I also missed a couple trips to interview abroad due to my visa restriction.
  • Clarity on my work and teams
    Candidates often asked about my work and products at Facebook at the end of interviews. By thinking about and answering those questions, I clearly define my own duties, and the work of my team.
  • Polishing my technical skills and general Android knowledge
    The technical skills we use here are very Facebook specific, but I would hear a lot of different terminologies, libraries, architectures that are used by candidates. I can then follow up on these to keep up with the market.
  • Helping my friends apply for software engineer positions
    It’s fine to help friends to prepare for Facebook interviews, as long as we don’t leak the real questions we ask. So I can specifically tell my friends what interviews look like, and what skills they should focus on.
  • Better understand position and level requirements
    After seeing so many interview decisions, I get a better sense on the requirements for Android positions at each level. This also clarifies what gaps I need to fill to advance my own career.
  • Performance review and career growth
    To be honest, the number of interviews doesn’t play a key role on performance review at company. However all the benefits mentioned above helps me a lot on my growth.
2018-10-29
29 October
On October 29, 2018
In IT Products(数码产品), Mobile Development(移动开发), Tangential Speech(漫话杂谈)

Google Pixel 3 XL 用户体验

上周收到了Pixel 3 XL,简单上手使用之后,最直接的感受是比较失望:

  • 丑陋的刘海造型,而且特别的厚,大部分应用都还没有对其做适应,所以状态条看起来非常不协调
  • 背后的材料变成了玻璃的,没有了原来铝材料的质感好
  • 新的导航手势也不是很舒适,特别是上划两次才能打开应用列表,因为用上划一次来取代了最近使用应用列表
  • 扬声器非常的差,播放声音时背后震动很强烈,声音也闷得好像是老式收音机
  • 跟Pixel 2 XL相比没有特别大的提升

值得点赞的地方可能就是:相机拍摄的照片更加清晰了,特别是前置摄像头带了两个摄像头,拍人像更好看了;还有那 Nexus 系列就有的到了 Pixel 前两代却去掉了的无线充电功能。

对于刘海就特别想吐槽,这部分跟状态栏重叠,所以会导致能显示的通知消息比原来少,非常的讨厌。对于有些应用将状态栏改成其他颜色时,刘海就会特别明显,但是如果进行屏幕截图,刘海的黑色部分又会被自动补全,造成所见影像和生成的图片不一致,非常的抓狂。
要想去除刘海,就需要打开“开发者选项(Developers Options)”来设置,但是真缺了那状态栏的一点空间又觉得挺可惜的。最搞笑的是“Double Cutout”,对称的上下两个刘海,可惜截图是看不出来的。

应用方便,对于 Pixel 3 和 Pixel 3 XL 独享的 Screening Call 表示赞叹,可以过滤掉不少垃圾电话。有些不足的地方是翻译过来的文字必须当场阅读,电话挂断之后就会消失,如果能自动把内容转到Google Voice的留言信息保存起来就更好了。

另外,非常喜欢 Google 还在 beta 测试中的 Digital Wellbeing 的服务,可以看到每天在各种应用上浪费的时间。

同时设置时间来约束使用时长,当天的配额用完后,系统就会应用启动图标变灰并且不能再使用。比如我把 YouTube 的时间设置成了30分钟来防止自己沉迷,但实际是经常我就去设置那边把约束时间去掉,然后静静地在 YouTube 上度过了3个小时。所以本身的自制力才是关键。
希望以后这个服务可以推出更多功能,比如这些功能都是我希望其提供的:导出数据;家长约束并设置不同密码(这样就可以交给太太来管制我);桌面图标小插件;更方便的访问入口。

 

最后,放两张Pixel XL系列的照片(比较讽刺的是照片使用太太的 iPhone X 拍摄的),以及三款手机的规格对比。

Pixel 3 XL Pixel 2 XL Pixel XL
Height 158 mm (6.2 inches) 158 mm (6.2 inches) 154.7 mm (6 inches)
Width 76.7 mm (3.0 inches) 76.7 mm (3.0 inches) 75.7 mm (2.9 inches)
Thickness 7.9 mm (0.3 inches) 7.9 mm (0.3 inches) 8.5 mm (0.3 inches)
Weight 184 grams (6.49 ounces) 175 grams (6.2 ounces) 168 grams (5.93 ounces)
Screen Size 160 mm (6.3 inches) 152.4 mm (6.0 inches) 139.7 mm (5.5 inches)
Screen resolution 2,960 x 1,440 pixels 2,880 x 1,440 pixels 2,560 x 1,440 pixels
Pixel Density 523 ppi 538 ppi 534 ppi
Screen To Body Ratio 83.49% 76.71% 71.04%
RAM 4 GB 4 GB 4 GB
Storage space 64 GB, 128 GB 64 GB, 128GB 32 GB, 128 GB
Processor Qualcomm Snapdragon 845 Qualcomm Snapdragon 835 Qualcomm Snapdragon 821
Graphics Adreno 630 Adreno 540 Adreno 530
Camera 12MP rear, dual 8MP lenses front 12MP rear, 8MP front 12MP rear, 8MP front
Colors Just Black, Clearly White, Not Pink Just Black, Black and White Very Silver, Quite Black, Really Blue
Release date October 9, 2018 October 4, 2017 October 4, 2016
2018-09-24
24 September
On September 24, 2018
In Programming Life(程序人生), Tangential Speech(漫话杂谈)

我的四次Facebook面试经历

在 FB 已经工作了已经快三年了,在这段日子里我学到了很多也成长得很快,一切似乎都有序地推进着,可回过头看加入 FB 的过程却有些一波三折。翻看邮件记录,我总共面了 FB 四次:头两次面完后我被拒了,第三次拿到了Offer但换成我拒了他们,直到第四次才达成一致加入进来。

 

第一次面试是在研究生刚毕业的时候,那会儿社交网络正火,对于 FB 和 Twitter 这些比较热门的公司都会收到很多简历,所以对于New Grad来说申请的门槛却要高很多,我也尝试网上申请但都石沉大海。

后来是通过 Interviewstreet (网站现在已经更名为 HackerRank 了)这个在线程序测试平台才拿到了面试机会。当时 Interviewstreet 上的题库很小但难度很高,只要做完8道题就可以解锁网站上公司申请功能。我当时只是觉得在上边做题很有趣,就一直不停地钻研着,也要感谢一位学长在题目解法上给了我很多的指点让我更快地领悟了各种算法的真谛。在艰难地完成了8道题后,我就随便点了网站上包括 FB 在内的几个知名公司提交了申请,我也没有觉得会有下文只是继续在上边做题来努力提高排位。

在我去 Seattle 面试 Amazon 的路上,我收到了 Interviewstreet 给 FB recruiter的引荐邮件。这让我感到非常惊喜,立刻表达了我强烈的兴趣,然后顺利安排了电话面试。电面一共面了两题,第一题很快就解决了,但是第二道关于二分查找的变体我却卡在了条件检查上了,最后是通过电子邮件把最后的答案发了过去。在邮件里我还把我写二分法的博客链接贴了上去来表达我是懂这个算法,好在面试官给了我 onsite 的机会。

因为那时候在忙着毕业的事情,还要带家人在美国游玩,所以把面试安排到了一个月以后。也因为如此,我并没有能够充分地去准备面试。


Read More →

2018-06-29
29 June
On June 29, 2018
In Data Structures(数据结构), Design Patterns(设计模式), Language Tips(语言初试)

隐秘而诡异的Java合成方法

Java程序里其实有很多我们看不到的代码,这些代码由Java编译器在编译过程中生成帮助程序更准确地运行。本文就来深入了解一下由编译器加入到Java代码中的方法(Method),特别是合成方法(Synthetic Method)。

合成方法

合成成员(Synthetic Member)在JVM细则里可以找到简单的定义

A class member that does not appear in the source code must be marked using a Synthetic attribute, or else it must have its ACC_SYNTHETIC flag set.

合成成员包含有合成类(Synthetic Class),合成变量(Synthetic Variable),合成方法(Synthetic Method),本文主要讨论合成方法。

合成方法不出现在.java文件中,不过编译之后会在.class里出现,并可以通过以下几个方法发现它们:

  • 在设置断点进行debug时会在方法栈上看到这些由编译器加入的方法
  • 通过反射(Reflection)查找到方法,通过isSyntehtic()方法来判定是否是合成函数
  • 利用一些反编译工具,比如 javap、JD-GUI、jad,查看.class文件可以找到这些方法

对于一般的Java程序而言并没有什么大的问题,只不过是额外的方法调用,代价比较低。但是像Android,它的Dex文件对于Java的方法有一定的约束,就值得去考虑如何避免额外的方法被生成。下边就来介绍一些常见的会出现合成方法的情况让我们有清楚地了解Java的运行机制。

嵌套类和私有成员

先来看一个代码案例,代码中定义了一个顶层类和嵌套类,互相会方法对方的一些private修饰的方法和字段。

[codesyntax lang=”java” lines=”normal”]

public class Outer {

  private int privateField = 21;
  private Inner inner = new Inner();

  private int privateMethod() {
    return inner.privateMethod();
  }

  private void print() {
    inner.print();
  }

  private static int privateStaticMethod() {
    return 7;
  }

  class Inner {
    private int privateMethod() {
      return privateField;
    }

    private void print() {
      System.out.println(Outer.this.privateMethod());
      System.out.println(privateStaticMethod());
    }
  }

  public static void main(String[] args) {
    Outer outer = new Outer();
    outer.print();
  }
}

[/codesyntax]

之前的文章有介绍了Java的修饰访问符的限制范围,类中由private修饰的成员,只能被该类自身所访问,因此嵌套类的私有成员不应该能被外部类访问。另一方面嵌套类虽然在外部类里面,但其实并不属于外部类的一部分,比如编译上边的代码会得到两个.class文件,Inner类被编译成了package可见的独立类。


Read More →

2018-05-22
22 May
On May 22, 2018
In Reading Notes(阅而后知), Tangential Speech(漫话杂谈)

从产品开发到《增长黑客》

忙碌了半年,最近我负责的几个项目都陆续投放市场,但从初期的市场反应来看,效果并不是很强烈,所以我们开启新一轮的迭代,寻求更好的方式来达到产品的增长。我的过往经验主要集中在技术上,对于“产品适应市场需求(Product/Market Fit)”这块相较薄弱,之前都是依靠我合作的增长市场分析师(Growth Marketing Analyst) Tina 来负责。年初我换组之后就失去了依靠,只能向她请教增长的技巧来自己亲自操作。在得到 Tina 的一些建议之外,她还向我推荐了范冰的《增长黑客 (Growth Hacker)》这本书,看完这本书之后也让我对产品增长方便的概念和策略有了很好得了解,至于我能不能应用到实践中还要等几个月后才能看出效果。

增长黑客这个概念的出现可能还不到10年时间,它最早是由Sean Ellis提出来,之后被Anrew Chen引用并引起巨大的反响。《增长黑客》这本书主要围绕着最近几年的产品开发所总结出来的一个生命周期“AARRR”:Acquisition(获取用户), Activation(激发活跃), Retention(提高存量), Revenue(增加推荐), Referral(传播推荐)。这几块组合在一起形成漏斗状来助推产品的发展。
Read More →

Posts pagination

Previous 1 2 3 … 11 Next
Facebook
Twitter
LinkedIn
RSS
ZhiHu

Recent Posts

  • AI Dev 26 x SF 体会
  • Google Pixel Phone 1 to 10
  • 三年居家工作感受
  • Pixel Watch智能手表和Pixel 5, 6 Pro 及 7 Pro手机
  • 我拥有过的无线耳机
  • 毕业工作一个月,我差点被开除
  • 我拥有过的移动硬盘

Categories

  • Algorithm Analysis(算法分析)
  • Article Collection(聚宝收藏)
  • Data Structures(数据结构)
  • Design Patterns(设计模式)
  • English Posts(英文写作)
  • Front Interface(界面构想)
  • IT Products(数码产品)
  • Knowledge Base(心得笔库)
  • Language Tips(语言初试)
  • Mathematical Theory(数学理论)
  • Mobile Development(移动开发)
  • Programming Life(程序人生)
  • Reading Notes(阅而后知)
  • Software Engineering(软件工程)
  • Special Tricks(奇技妙招)
  • Tangential Speech(漫话杂谈)

Tags

Aero Android API App Bash Binary Search Bitwise Operation Book C/C++ Career Chrome Conference CSS Debug Device DOM Extension Framework Game Google Gradle Hearthstone HTML Initialization Interview iOS Java JavaScript jQuery Keyword Language Issues Mac Microsoft Mobile Modifier Objective-C PHP Principle Reference Static String Tools Tutorial UI XML

Blogroll

  • Ahmed's Blog
  • Gert Lombard's Blog
  • Gordon Luk
  • Jack & Allison
  • 开发部落

Archives

Designed using Chromatic. Powered by WordPress.