自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

tigershin的专栏

Effective Java 3rd cn

  • 博客(43)
  • 资源 (7)
  • 收藏
  • 关注

原创 如何使用协程Flow定义链式调用DSL

定义DSL定义启动flow的函数: protected val _spinner: MutableLiveData<Boolean> by lazy { MutableLiveData<Boolean>() } val spinner: LiveData<Boolean> get() = _spinner ...

2019-07-25 16:59:15 910

翻译 Kotlin协程高级技巧和诀窍

Kotlin协程出奇地简单:仅仅让一些长期运行的操作放在launch里面,然后就好了,是这样的把?对于简单的情况,当然如此了。但是很快,并发和并行固有的复杂性开始积累。当你深入协程战壕时,下面内容是你需要知道的。取消 + 阻塞式的工作 =

2019-01-29 21:22:36 4589 2

翻译 kotlin coroutine文档:共享可变状态和并发

共享可变状态和并发可以使用Dispatchers.Default等多线程调度程序并行执行协程。 它产生了所有常见的并发问题。 主要问题是同步访问共享可变状态。 在协程域中解决这个问题的一些解决方案类似于多线程世界中的解决方案,但其他解决方案却是独一无二的。问题让我们开启一百个协程,它们都做了一千次相同的动作。 我们还将测量完成时间以进行进一步比较:suspend fun Coroutine...

2019-01-26 23:03:21 830

翻译 kotlin coroutine文档:通道

通道延迟值提供了在协同程序之间传输单个值的便捷方法。 通道提供了一种传输值流的方法。通道是kotlinx.coroutines的实验性的功能。 他们的API预计将在接下里的kotlinx.coroutines库更新中变化,并且可能会发生重大变化。通道基础Channel在概念上与BlockingQueue非常相似。 一个关键的区别是,它不是阻塞式的put操作,而是具有挂起的send,而不是阻...

2019-01-26 20:37:32 658

翻译 kotlin coroutine文档:协程上下文和调度器

Coroutine context and dispatchersCoroutines always execute in some context which is represented by the value of CoroutineContext type, defined in the Kotlin standard library.The coroutine context is...

2019-01-18 11:01:02 1972 4

翻译 kotlin coroutine文档:组合挂起函数

组合挂起函数这部分讲述组合挂起函数的不同方法默认是顺序的假设我们有两个在别处定义的挂起函数,它们做一些有用的东西,像某种服务请求或者计算。我们假设它们仅仅是有用的,但是为了说明这个例子,每个实际上仅仅延迟一秒:suspend fun doSomethingUsefulOne(): Int { delay(1000L) // 假设我们在这里做一些有用的事情 return 13...

2019-01-13 20:03:04 477

翻译 kotlin coroutine文档:取消和超时

取消和超时这部分讲述协程的取消和超时取消协程的执行在一个长期运行的应用,你可能需要细粒度地控制后台协程。例如,一个用户可能关闭页面,这个页面启动了一个协程,它的结果现在不再需要了,它的运行应该要取消。launch函数返回一个Job,它可以用来取消运行的协程:import kotlinx.coroutines.*fun main() = runBlocking {//例子开始 ...

2019-01-13 12:09:24 1853

翻译 kotlin coroutine文档:基础

协程基础这部分讲述协程基础概念。第一个协程运行如下代码:import kotlinx.coroutines.*fun main() { GlobalScope.launch { // 在后台启动新协程,然后继续运行 delay(1000L) // 非阻塞式延时1秒(默认时间单位是毫秒) println(&amp;quot;World!&amp;quot;) // 在延时后打印 ...

2019-01-12 23:27:42 187

翻译 Effective Java 3rd 条目28 列表优于队列

队列在两个方向上与泛型不相同。首先,队列是协变的。这个听上去令人不安的单词意思仅仅是:如果Sub是Super的一个子类,那么队列类型Sub[]是Super[]的一个子类。相反,泛型是非协变的:对于任何两个不同类型Type1和Type2,List&amp;amp;lt;Type1&amp;amp;gt;既不是List&amp;amp;lt;Type2&amp;amp;gt;的一个子类,也不是它的超类[JLS, 4.10; Naftalin07, 2.5]。你可能...

2018-12-16 21:50:06 92

翻译 Kotlin Coroutines 模式与反模式

原文在此,可能需要翻墙文章目录简介处理异常时,用coroutineScope或者使用SupervisorJob包装异步调用主协程最好选择Main调度器避免使用多余的async/await避免取消域的job避免编写用隐式调度器的挂起函数避免使用全局域简介决定写一些东西,在我看来当你使用Kotlin coroutines时,这些东西你应该做和不应该做(或者说,至少试着避免做)。处理异常时,用c...

2018-12-16 21:17:03 396

原创 Cocos creator 大厅子游戏和热更新

工作中,需要把cocos creator创建的多个游戏适配到Android和ios应用中,经过调研,可以利用大厅子游戏模式实现。大厅本身作为一个游戏工程,可以有加载页面,和热加载子游戏。热更新:https://www.jianshu.com/p/9fc813fe9e4c大厅子游戏:https://www.jianshu.com/p/fe54ca980384如何动态加载和更新子游戏:自从...

2018-12-10 20:50:01 2662 1

翻译 Effective Java 3rd 条目27 消除非受检警告

当你用泛型编程时,你将会看见许多编译器警告:非受检强转警告、非受检方法调用警告、非受检参数化vararg类型警告和非受检转换警告。你多熟悉泛型一些,你将获得更少警告,但是不要期待这些新代码干净利索地编译。许多非受检警告容易消除。例如,假设你不慎编写如下声明:Set&lt;Lark&gt; exaltation = new HashSet();编译器会轻轻地告诉你做错了什么:Vene...

2018-03-12 22:12:12 283

翻译 Effective Java 3rd 条目26 不要使用原生类型

首先,一些术语。类或者接口,它的声明有一个或者多个类型参数(type parameter),是泛型(generic)类或者接口[JLS, 8.1.2, 9.1.2]。例如,List接口有一个类型参数,E,代表它的元素类型。这个接口的完整名字是List&lt;E&gt;(读作“E的列表”),但是人们常常简单地叫它为List。泛型类和接口全部叫做泛型类型。每个泛型类型定义了参数化(paramete...

2018-03-06 22:55:43 271

翻译 Effective Java 3rd 条目25 将源文件限制在单个顶层类

虽然Java编译器让你在单个源文件中定义多个顶层类,但是这么做没有任何益处。危险性来自这个事实:在单个源文件中定义多个顶层类,使得为一个类提供多个定义变得可能。使用哪个定义,受传递到编译器的源文件顺序的影响。为了使得这具体些,考虑如下源文件,它仅仅包含了一个Main类,这个类引用另外两个顶层类(Utensil和Dessert)的成员:public class Main { p...

2018-02-27 23:06:29 185

翻译 Effective Java 3rd 条目24 静态成员类优于非静态

嵌套类(nested class)是一个定义在另外一个类内部的类。嵌套类应该仅仅是为了服务外部类而存在。如果内嵌类在其他某些情形下有用,那么他应该是一个顶层类。有四种嵌套类:静态成员类(static member class)、非静态成员类(nonstatic member class)、匿名类(anonymous class)和本地类(local class)。只有第一种是被认为是内部类。这个条...

2018-02-27 22:52:10 224

翻译 Effective Java 3rd 条目23 类层级优于标签类

偶尔,你可能遇见一个类,它的实例有两个或者更多的特点(flavor),而且包含了一个标签(tag)域表明这个实例的特点。比如,考虑如下类,它可以代表一个圆形或者长方形:// 标签类 - 大大次于类层级! class Figure { enum Shape { RECTANGLE, CIRCLE }; // 标签域 - 这个图形的形状 final Shape shape; /

2018-02-26 09:56:43 206

翻译 Effective Java 3rd 条目22 仅仅定义类型时使用接口

当一个类实现一个接口时,这个接口起一个类型的作用,可以被用来引用这个类的实例。一个类实现了一个接口,应该因此说明一些事情:使用这个类的实例,一个类可以做什么。为任何其他目的而定义一个接口,都是不恰当的。 不符合这个检测的一种接口是所谓的常量接口(constant interface)。这样的接口不包含任何方法;它仅仅包含静态final域,每个域导出一个常量。使用这些常量的类实现这个接口,避免了用...

2018-02-24 13:56:08 191

翻译 Effective Java 3rd 条目21 为后代设计接口

在Java8之前,添加方法到接口而没有破坏已存实现,是不可能的。如果你添加了一个新方法到接口,已存实现通常缺少这个方法,导致编译时期错误。在Java8中,添加了默认方法构造(default method construct)[JLS 9.4],让方法添加到已存接口。但是添加新方法到已存接口充满了危险性。默认方法的声明包括一个默认实现(default implementation),实现接口的所...

2018-02-24 13:46:15 187

翻译 Effective Java 3rd 条目20 接口优于抽象类

Java有两个机制定义允许多个实现的类型:接口和抽象类。因为在Java8中引入了接口的默认方法(default method)[JLS 9.4.3],所以两个机制都让你可以为一些实例方法提供实现。主要的区别在于,为了实现由抽象类定义的类型,一个类必须是这个抽象类的子类。因为Java仅仅允许单继承,抽象类的限制严重约束了作为类型定义的使用。定义所有必需方法和遵从通用规范的任何类,允许实现一个接口,而...

2018-02-13 22:45:48 239

翻译 Effective Java 3rd 条目19 为继承设计和文档化,否则禁止它

条目18使你意识到子类化一个“不熟悉的”类的危险性,该类不是为继承设计和文档化。那么一个类是为继承设计和文档化,是什么意思呢?首先,类必须清晰地文档化覆写任何方法的影响。换句话说,类必须文档化可覆写方法的它的自用性(self-use)。对于每个公开或者受保护的方法,文档必须表明这方法调用了哪个可覆写方法、是什么顺序,而且每个调用的结果怎么影响了后续处理。(对于可覆写的(overridable)

2018-01-31 22:03:21 166

翻译 Effective Java 3rd 条目18 组合优于继承

继承是取得代码复用的一种强大方式,但是对于这项工作它不总是最好的工具。如果使用不恰当,那么这将导致脆落的软件。在一个包里面使用继承是安全的,包里面的子类和超类实现是在同一个程序员的控制之下。当特意为扩展而设计和文档化的类(条目19)时,使用继承也是安全的。跨包界线继承普通具体类,无论如何是危险的。提醒一下,这本书使用“继承”意思是实现继承(implementation inheritance)(当一

2018-01-27 18:40:26 399

翻译 Effective Java 3rd 条目17 最小化可变性

一个不可变类简单地讲是实例不可以改变的一个类。在每个实例里面包含的所有信息在对象的生命周期里面是确定的,所以改变从来不会看到。Java平台库包含了许多不可变类,包括String、原始装箱类型和BigInteger与BigDecimal。为此,有很多很好的理由:不可变类比可变类更容易设计、实现和使用。它们更不容易出错而且更加安全。为了使得一个类不可变,遵循五条规则:不要提供修改对象状态的方

2018-01-23 23:12:37 186

翻译 Effective Java 3rd 条目16 在公开类使用访问方法而不是公开域

偶然地你可能忍不住编写一个退化的类,除了把实例域分组以外不作为任何目的:// 像这样的退化的类不应该是公开的! class Point { public double x; public double y; }因为这样的类的数据域可以直接访问,所以这些类没有提供封装的优点(条目15)。没有改变API你就不能改变这个表示,你不能实现不变性,而且当访问一个域时你不能采取辅助行动。不妥

2018-01-21 17:15:46 189

翻译 Effective Java 3rd 条目15 最小化类和成员的可访问性

区分良好设计与不良设计的组件的最重要的因素是,这个组件对其他组件隐藏它的内部数据和其他实现细节的程度。一个设计良好的组件隐藏了它的所有实现细节,干净地把它的API从它的实现中分离。然后组件仅仅可以通过它们的API通讯,而且不知道它们彼此的内部运作。这个概念,叫信息隐藏(information hiding)或者封装(encapsulation),是软件设计的一个基础原则[Parnas72]。信息隐藏

2018-01-21 10:49:27 290

翻译 Effective Java 3rd 条目14 考虑实现Comparable

不像本章讨论的其他方法,compareTo方法不是在Object中声明的。更确切地说,它是Comparable接口的唯一方法。在角色上像Object的equals方法,除了它允许简单的相等比较之外,它还允许顺序比较,而且它是支持泛型的。通过实现Comparable,一个类表明它的实例有一个自然排序(natural ordering)。由实现Comparable的对象组成的一个队列,它的排序就像下面...

2018-01-20 12:04:04 401

翻译 Effective Java 3rd 条目13 谨慎覆写clone

Cloneable接口目的是为类作为一个混入接口,宣称它们允许克隆。不幸的是,它未能作为这个目的。它的主要缺点在于,它缺少了clone方法,而且Object的clone方法是受保护的。没有诉诸于反射(条目65),你不能调用对象的clone,仅仅因为它实现了Cloneable。甚至反射调用可能失败,因为没有保证对象有一个可获取的clone方法。尽管这个缺点和其他的缺点,这个技巧在合理的广泛使用中,所

2018-01-17 23:55:47 367

翻译 Effective Java 3rd 条目12 每次都覆写toString

虽然Object提供了一个toString方法的实现,但是它返回的字符串通常不是你的类使用者想看的。它包含了类名, 紧随着一个“at”符号(@)和无符号的哈希码的十六进制表示,比如PhoneNumber@163b91。toString的通用协定说,返回的字符串应该是“一个简洁但是易于读懂的信息表达”。虽然PhoneNumber@163b91是简洁和容易阅读,这可能有争议,但对比707-867-53

2018-01-13 17:25:22 467

翻译 Effective Java 3rd 条目11 当你覆写equals时每次都覆写hashCode

在每个覆写equals的类中,你必须覆写hashCode。如果你不这么做,你的类将违反hashCode的通用协定,这将阻止它在数据集(比如HashMap和HashSet)中正常运行。以下是这个协定,改编自Object的文档:在应用执行期间,当在一个对象上反复调用hashCode方法时,它必须一致返回同样的值,假设equals比较中使用的信息没有改变。当一个应用的执行到另外一个应用, 这个值没必要保

2018-01-12 23:09:10 493

翻译 Effective Java 3rd 条目10 当覆写equals时遵从通用协定

覆写equals方法看上去简单,但是有许多方式弄错这个问题,而且后果可能严重。避免这个问题的最容易的方式是,不要覆写equals方法,这种情况下,这个类的每个实例只等于它本身。如果下列条件之一符合,就是做正确事情:类的每个实例本质上是唯一的。对于这些类,比如表示激活实体而不是值的Thread,是正确的。对于这些类,Object提供的equals实现恰好有正确的行为。没有必要为类提供一个“逻

2018-01-03 21:16:07 612

翻译 Effective Java 3rd 条目9 try-with-resource优于try-finally

Java库包含很多资源,这些资源必须手动调用close方法关闭。这样的例子包括InputStream、OutputStream,和java.sql.Connection。关闭资源常常被客户端忽略,可以预见会有可怕的性能后果。许多这些资源用finalizer作为安全保障,但是finalizer不会很好的工作(条目8)。历史上,一个资源应该正确地关闭,即使面对一个异常或者返回,try-finally语句

2018-01-03 10:44:20 401

翻译 Effective Java 3rd 条目8 避免使用finalizer和cleaner

Finalizer是不可预测的,常常是危险的,而且通常来说是不必要的。它的使用会引起不稳定的行为、糟糕的性能和可移植性问题。Finalizer有一些正当的用法,我们将在这个条目后面讲述,但是一般来说,你应该避免使用它。在Java 9中,finalizer被弃用了,但是它仍然在Java库里面使用着。Java 9中finalizer的替代是cleaner。Cleaner危险性比finalizer小,但

2018-01-01 22:40:21 507

翻译 Effective Java 3rd 条目7 消除过期对象引用

如果你是从手动内存管理的语言(比如C或者C++)切换到垃圾回收语言(比如Java),作为程序员你的工作会变得更容易,因为当你用完了对象时会被自动回收。当你第一次经历的时候,这好像是魔法一样。这可能容易导致这种印象:你不必要考虑内存管理,但是这不完全正确的。考虑如下栈实现的例子:// 你能指出“内存泄漏”吗?public class Stack { private Object[] elem

2018-01-01 10:41:09 488

翻译 Effective Java 3rd 条目6 避免创建不必要的对象

这通常是恰当的:重用单个对象,而不是每次需要的时候创建一个新的功能相同的对象。重用既更快又更有风格。如果不可变,一个对象总是可以被重用(条目17)。作为不应该做的事情的一个极端例子,考虑这个语句:String s = new String("bikini");// 不要这么做!每次执行时这个语句时创建一个新的String实例,这些对象创建没有一个是必要的。String构造子的参数(“bikini”)

2017-12-30 18:38:54 533

翻译 Effective Java 3rd 条目5 依赖注射优于硬耦合资源

很多类依赖于一个或者多个相关资源。比如,一个拼写检测器依赖一个字典。这样的类实现为静态效用类,这是很常见的(条目4):// 不恰当的静态效用的使用 - 不灵活而且不可测试!public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() {} // 不可

2017-12-29 23:03:34 875

翻译 Effective Java 3rd 条目4 用私有构造子实现不可实例化

有时,你想编写一个仅仅是一组静态方法和静态域的类。这样的类有个坏名声,因为一些人滥用它们来避免用对象的方式来思考,但是它们确实有正当的用途。以java.lang.Math或者java.util.Arrays的方式,它们可以把在原始或者队列上相应的方法归类。以java.util.Collections的方式,它们也可以归类实现了某个接口的对象的静态方法(包括工厂)(条目1)。(就像在Java 8,你也

2017-12-29 15:54:06 634

翻译 Effective Java 3rd 条目3 用私有构造子或者枚举类型强化单例属性

单例(singleton)仅仅是一个恰好能实例化一次的类[Gamma95]。单例一般代表一个无状态的对象(比如,一个函数),或者一个本质唯一性的系统组件。一个类变为单例使得难于测试它的客户端,因为替代单例的模拟(mock)实现是不可能的,除非它实现了一个作为自己类型的接口。有两种通常的方式实现单例。两者都是基于保持构造子私有和导出提供获取这个单一实例的公开静态成员。在第一个方法中,成员是一个fina

2017-12-29 11:29:25 576

翻译 Effective Java 3rd 条目2 面临众多构造子参数时考虑builder

静态工厂和构造子都有一个限制:它们不能很好调节大量可选参数。考虑这个情况,一个类表示包装食品上的营养成分标签。这些标签有些是必需的域,食用份量、份数和每份卡路里数;还有二十多个可选域,总脂肪含量、饱和脂肪含量、反脂肪含量、胆固醇含量,钠含量等等。大多数产品中这些可选参数只有很少的非零值。对于这样的类,你打算用什么类型的构造子或者静态工厂?习惯上,编程人员用重叠构造子(telescoping cons

2017-12-28 15:05:49 550

翻译 Effective Java 3rd 条目1 考虑用静态工厂方法代替构造子

对于一个类,让客户端获取一个实例的传统方式是,提供一个公开的构造子(constructor)。另外一个技巧,应该成为每个程序员的工具库之一。一个类可以提供一个公开的静态工厂方法(static factory method), 这个静态方法简单地返回这个类的实例。这里有关于Boolean(boolean 的原始装箱类(boxed primitive))的简单例子。这个方法把boolean原始值转换到

2017-12-27 16:38:06 442

翻译 Kotlin实战02 — Kotlin基础

这章将讲述 - 声明函数、变量、类、枚举和属性 - Kotlin的控制结构 - 智能强转 - 抛和处理异常1 基本元素: 函数和变量Kotlin的两大元素:函数和变量。你将明白,你可以省略类型声明,还有鼓励你使用不变而不是可变的数据。1.1 Hello, world!让我们以一个经典的例子开始:打印“Hello, world!”,在Kotlin中,你只需要一个函数:fun

2017-07-18 17:37:20 1199

翻译 Android MVVM之禅

原文:https://proandroiddev.com/zen-android-mvvm-160c26f3203c在各种各样的Android应用上,用多种变更和迭代方式实现MVP模式后,我决定以Android的Data Binding库作为基本,探索MVVM。结果使得我处于一种接近Android编码狂喜的状态。在带领你们穿过我采取的接近涅槃的步骤之前,我想先分享这次尝试的目标:一个MVVM单元应该

2017-07-17 17:59:37 1367

concurrent-patterns-best-practices-synchronization

I still remember the Aha! moment when I understood how UNIX shell pipeline works. I fell headlong in love with Linux and the command line and tried out many combination filters (a filter is a program reading from standard input and writes to standard output) connected via pipes. I was amazed by the creativity and power brought about by the command line. I was working with concurrent programs. Then, there was a change of project and I was thrown headlong into writing code using the multithreaded paradigm. The language was C or C++, which I loved deeply; however, to my surprise I found that it was a herculean effort to maintain a legacy code base, written in C/C++ that was multithreaded. The shared state was managed in a haphazard way and a small mistake could throw us into a debugging nightmare!

2018-10-26

Intermediate.iOS.Programming.with.Swift.iOS.10.and.Swift.3

中级ios开发资料

2017-07-17

Wiley.Machine.Learning.Hands-On.for.Developers.and.Technical.Professionals

Wiley.Machine.Learning.Hands-On.for.Developers.and.Technical.Professionals

2017-04-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除