-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patheffective-java-for-android.html
More file actions
275 lines (197 loc) · 11.6 KB
/
effective-java-for-android.html
File metadata and controls
275 lines (197 loc) · 11.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
<!DOCTYPE html>
<html>
<head>
<!-- [[! Document Settings ]] -->
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- [[! Page Meta ]] -->
<title>Android开发中的Java最佳实践</title>
<meta name="description" content="与机器,人,神共舞 - 编程,读书,思考,旅行,与机器对话,与人交谈,对神发问,探索,体验人生美丽的风景" />
<meta name="HandheldFriendly" content="True" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="shortcut icon" href="/assets/images/favicon.ico" >
<!-- [[! Styles'n'Scripts ]] -->
<link rel="stylesheet" type="text/css" href="/assets/css/screen.css" />
<link rel="stylesheet" type="text/css"
href="//fonts.googleapis.com/css?family=Merriweather:300,700,700italic,300italic|Open+Sans:700,400" />
<link rel="stylesheet" type="text/css" href="/assets/css/syntax.css" />
<!-- [[! Ghost outputs important style and meta data with this tag ]] -->
<link rel="canonical" href="/" />
<meta name="referrer" content="origin" />
<link rel="next" href="/page2/" />
<meta property="og:site_name" content="与机器,人,神共舞" />
<meta property="og:type" content="website" />
<meta property="og:title" content="与机器,人,神共舞" />
<meta property="og:description" content="编程,读书,思考,旅行,与机器对话,与人交谈,对神发问,探索,体验人生美丽的风景" />
<meta property="og:url" content="/" />
<meta property="og:image" content="/assets/images/cover1.jpg" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="与机器,人,神共舞" />
<meta name="twitter:description" content="编程,读书,思考,旅行,与机器对话,与人交谈,对神发问,探索,体验人生美丽的风景" />
<meta name="twitter:url" content="/" />
<meta name="twitter:image:src" content="/assets/images/cover1.jpg" />
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "Website",
"publisher": "Tao's Page",
"url": "/",
"image": "/assets/images/cover1.jpg",
"description": "编程,读书,思考,旅行,与机器对话,与人交谈,对神发问,探索,体验人生美丽的风景"
}
</script>
<meta name="generator" content="Jekyll 3.0.0" />
<link rel="alternate" type="application/rss+xml" title="与机器,人,神共舞" href="/rss.xml" />
</head>
<body class="home-template nav-closed">
<div class="nav">
<h3 class="nav-title">Menu</h3>
<a href="#" class="nav-close">
<span class="hidden">Close</span>
</a>
<ul>
<li class="nav-home " role="presentation"><a href="/">Home</a></li>
<li class="nav-about " role="presentation"><a href="/about.html">About</a></li>
<li class="nav-fables " role="presentation"><a href="/tag/machine/">Machine</a></li>
<li class="nav-speeches " role="presentation"><a href="/tag/human/">Human</a></li>
<li class="nav-fiction " role="presentation"><a href="/tag/god/">God</a></li>
<li class="nav-author " role="presentation"><a href="/author/hetao/">Author</a></li>
</ul>
<a class="subscribe-button icon-feed" href="/vocab.html">Apps</a>
</div>
<span class="nav-cover"></span>
<div class="site-wrapper">
<!-- [[! Everything else gets inserted here ]] -->
<!-- default -->
<!-- The comment above "< default" means - insert everything in this file into -->
<!-- the [body] of the default.hbs template, which contains our header/footer. -->
<!-- Everything inside the #post tags pulls data from the post -->
<!-- #post -->
<header class="main-header post-head no-cover">
<nav class="main-nav clearfix">
</nav>
</header>
<main class="content" role="main">
<article class="post tag-machine">
<header class="post-header">
<h1 class="post-title">Android开发中的Java最佳实践</h1>
<section class="post-meta">
<!-- <a href='/'>Tao He</a> -->
<time class="post-date" datetime="2016-03-06">06 Mar 2016</time>
<!-- [[tags prefix=" on "]] -->
on
<a href='/tag/machine'>Machine</a>
</section>
</header>
<section class="post-content">
<p>我本人其实是不想把这种在开发中的实践经验称作最佳实践的,英文叫做effective,不过国内翻译的很多技术类书籍也都这么翻译,就权且这样说吧。笔者之前一直在Windows下用C++做应用开发,最近已经转战大热的移动开发,一不小心已经做了快三个多月的Android开发了。作为一个技术转型的老C++程序员,想谈谈Java在Android开发中的一些实践经验,虽然Java之于我也是一门新的编程语言,但是并没那么陌生,相近的语言类型和语法习惯,还是非常容易上手,并且作为一个新手,可能还可以看到一些老Java程序员看到不到的地方,话不多说,下面就开始一些经验之谈。</p>
<ul>
<li>适时使用构建模式</li>
</ul>
<p>当你有个类的构造方法需要超过三个参数去构建一个对象的时候,使用构建者去构建这个对象。虽然写起来比较冗余,但是可扩展性和可读性比较好。如:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>class Movie {
static class Builder {
String title;
Builder withTitle(String title) {
this.title = title;
return this;
}
Movie build() {
return new Movie(title);
}
}
private Movie(String title) {
[...]
}
}
// Use like this:
Movie matrix = new Movie.Builder().withTitle("The Matrix").build();
</code></pre></div></div>
<ul>
<li>使用静态工厂方法</li>
</ul>
<p>使用静态工厂方法和私有构造方法来替代new关键字加构造方法的方式,这些静态工厂方法都是明确命名的,不需要每次都返回一个实例对象,并且可以按需返回子类型对象。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>class Movie {
[...]
public static Movie create(String title) {
return new Movie(title);
}
}
</code></pre></div></div>
<ul>
<li>使用静态内部类</li>
</ul>
<p>如果你定义一个内部类不依赖于外部类,不要忘记把它定义为static,如果忘了这么做,因为Java语法,非静态内部类默认会引用外部类,这也是导致很多Android应用内存泄漏的祸因。</p>
<ul>
<li>返回空Collection,而不是null</li>
</ul>
<p>当不得不返回一个list/Collection时,且没有数据的时候,尽量避免返回null,而是应该返回一个空的list/Collection. 返回一个空的容易,让使用者避免判空,并避开了意想不到的NPE. 在实际操作中应该返回同一个空的Collection, 而不是重新创建一个。</p>
<ul>
<li>使用StringBuilder</li>
</ul>
<p>在不得不进行字符串拼接时,最好不要直接使用 + 运算符拼接,尽量使用StringBuilder来拼接字符串。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>String latestMovieOneLiner(List<Movie> movies) {
StringBuilder sb = new StringBuilder();
for (Movie movie : movies) {
sb.append(movie);
}
return sb.toString();
}
</code></pre></div></div>
<ul>
<li>强制不能实例化</li>
</ul>
<p>如果想让一个类不能通过new关键字在堆上创建对象,可以将其构造方法设为private。 尤其一些工具类只包含静态方法,并不需要类的实例,因此可以通过这种方式避免意外发生。</p>
<ul>
<li>避免可变性</li>
</ul>
<p>保证一个对象在它的整个生命周期中状态都保持不变,这种方式使得对象简单,线程安全,可共享。</p>
<p>以上是我在做了三个多月Android开发的过程中积累的一些实践经验,后续如再有所得,会写新的post出来,欢迎大家在评论中谈谈自己的心得。</p>
</section>
<footer class="post-footer">
<!-- Everything inside the #author tags pulls data from the author -->
<!-- #author-->
<!-- Add Disqus Comments -->
</footer>
</article>
</main>
<aside class="read-next">
<!-- [[! next_post ]] -->
<a class="read-next-story no-cover" href="/factory-vs-factory-method-vs-abstract-factory">
<section class="post">
<h2>简单工厂模式vs.工厂方法vs.抽象工厂</h2>
<p>开始从事编程这一行以来,一直对设计模式这块不是很重视,也许在研发过程中已经不知不觉得遇到或者使用过一些常用的设计模式,也边看边用过一些,但是一直未曾系统的学习过一些经典的,常见的设计模式,于是最近抽空开始看一些专门讲设计模式的书,不知不觉也复习了不下十个设计模式,在复习到工厂模式时,连看了好几遍,感觉还是对简单工厂模式,工厂方法,抽象工厂的概念无法清晰的区分和准确辨别其使用场景。看了很多文章和资料,经过自己的总结和思考后有所得,并且希望能通过很简练的方式把这个问题说清楚,巩固复习成果,于是便有了此文。 先说三种设计模式的相同点,之后再来逐个看三者的区别。相同点很明显, 有以下几点: * 这三种设计模式都是创建类模式,均可以称之为"smart constructor” * 三者都隐藏了实例化的逻辑, 换句或说就是封装了对象的创建过程 * 都有一个创建的工厂类来创建相应的对象 以下来谈谈不同点: 简单工厂模式 * 有一个工厂类来创建一个或多个类型的对象...</p>
</section>
</a>
<!-- [[! /next_post ]] -->
<!-- [[! prev_post ]] -->
<a class="read-next-story prev no-cover" href="/using-duilib-to-build-gui">
<section class="post">
<h2>Using Duilib to build GUI</h2>
<p>Duilib is a free open source DirectUI library on Windows , because its simple and...</p>
</section>
</a>
<!-- [[! /prev_post ]] -->
</aside>
<!-- /post -->
<footer class="site-footer clearfix">
<section class="copyright"><a href="/">与机器,人,神共舞</a> © 2024</section>
</footer>
</div>
<!-- [[! Ghost outputs important scripts and data with this tag ]] -->
<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
<!-- [[! The main JavaScript file for Casper ]] -->
<script type="text/javascript" src="/assets/js/jquery.fitvids.js"></script>
<script type="text/javascript" src="/assets/js/index.js"></script>
<!-- Add Google Analytics -->
<!-- Google Analytics Tracking code -->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-78960009-1', 'auto');
ga('send', 'pageview');
</script>
</body>
</html>