Gradle实战(零):Gradle 的基本使用

1. Java 项目引入 Gradle 插件

当我们不通过 IDE 的方式构建 Java 项目,那么在编写完成后,运行项目就需要使用 javac 、jar 等这样的工具来帮我们运行项目,无疑在开发过程中这是十分痛苦的。使用 Gradle 插件具体自动化执行编译、运行等过程。Gradle 通过引入特定领域的约定和 Task 来扩展项目。而 Java 插件是 Gradle 自身装载的一个插件,可以实现很多的功能,比如定义标准的项目布局、有顺序的执行任务。

Read More

Flutter核心技术与实战(二):Widget 是什么?

Widget 是什么?

Flutter 的核心思想是:一切皆为 Widget,那么什么是 Widget 呢?

Widget 是 Flutter 功能的抽象描述,是 视图的配置信息,是数据的映射。

Widget 的渲染过程

Flutter 如何结构化的组织数据,提供给渲染引擎,最终完成界面显示。

Flutter 将视图树的概念进行扩展,把视图数据的 组织渲染 分为三部分,即 Widget、Element、RenderObject。

Widget、Element、RenderObject 的关系

Widget

Widget 是在 Flutter 世界里对视图的一种结构化的描述,可以类比 Android 中的控件的概念,Widget 里面存储的是有关视图渲染的配额制信息,包括布局、渲染属性、事件响应信息等。

Flutter 将 Widget 设计成不可变的,当视图渲染的配置信息发生改变时,Flutter 会选择重建 Widget 树的方式进行数据更新,以数据驱动 UI 的构建方式控制视图显示。 Flutter
这样的设计会存在大量的数据的销毁和重建,会对垃圾回收造成压力。

Flutter核心技术与实战(一):Dart语言基础

1. Dart的变量与类型

在 Dart 中,可以使用 var 或者具体的类型来声明一个变量,当使用 var 定义变量时,表示类型交由编译器推断决定。Dart 是 类型安全 的语言,所以的类型均继承与 Object,因此所有的类型都是对象类型,默认情况下,未初始化的变量的值为 null

1.1 num、bool与 String

num 为 Dart 的数据类型,只有两种子类:int 和 double,使用 bool 表示布尔值,有 false 和 true 两种状态,它们均是编译时常量。在 Dart 中字符串可以通过单引号、双引号、嵌入表达式、多行字符串的形式表示。

Read More

Kotlin 核心编程(十一):作用域函数 let、run、with、apply、also

在 also、let 的 Lambda 表达式内,it 代表接收者类型对象,而不像 《Kotlin 核心编程》 一书中所说的,this 代表接收者类型对象,而且在 also、let 中同时存在 this,并且通过 this 可以访问到外层变量,自己对此充满疑问,感觉书中对 this 为接收者对象的方法过于武断,查官方文档,十分幸运,正好有一篇关于此内容的文档,不过为英文,自己读了一遍,觉得在翻译此文在自己能力范围内,故做大致翻译,但是不会逐字翻译,得其大概即可。

Read More

Kotlin 核心编程(六):空安全

0x0001 Java 中存在歧义的 null

null 含义:

  • 该值未初始化
  • 该值不合法
  • 该值不需要
  • 该值不存在

0x0002 难以控制的 NPE

在 Java 中任何对象引用都可以为 null,而当调用为 null 对象的方法时,将产生 NPE,最终导致的是:编译顺畅通过,但是运行代码时却产生了 NPE。

比如此种情况:

1
2
String name = null;
System.out.println(name.length());

而我们只能通过一些判空代码进行避免,但是往往将 null 和空字符串混为一谈,违背了业务初衷,示例如下:

1
2
3
4
String name = null;
if(name != null || ("").equal.(name)){
System.out.println(name.length());
}

0x0003 可空类型

Kotlin 在类型层面提供了空类型,以此来解决由 null 引发的问题。

Java8 中的 Optional

对于不确定是否存在的属性,可以使用 Optional 来封装。

但是 Optional 的耗时大约是普通判空的十倍,原因是 Optional 是一个包含类型 T 引用的泛型类,在使用时多个创建一个对象,在数据量比较大的时候,频繁实例化造成很大的性能损失。

Kotlin 中的可空类型

而 Kotlin 中处理 NPE 问题十分容易。

Java 中存在 Optional 包装类,而 Kotin 中可空类型使用 类型? 表示:

1
var name:String? = null

Kotlin 中的安全调用 ?.

在 Java 这么写:

1
2
3
if(name != null){
sout(name.length());
}

在 Kotlin 中这么写:

1
sout("${name?.length}")

?. 称为 安全调用,只有当 name 存在时才会调用 name.length。

Kotlin 中的 Elvis 操作符 ?:

?: 左侧为 null 时,则执行其右侧值。

1
2
val num = name?.length?:-1
println(num)

?: 左侧不仅可以是语句还可以是表达式或者函数。

1
2
3
4
val type = getType() ?: getDefaultType()
println(type)
val type2 = getType() ?: "Default: ${type?.length}"
println(type2)

Kotlin 如今实现类型的空安全:

1
2
3
4
5
6
7
8
9
10

fun test301(name: String? ) {
println(name?.length)
}
// 编译后的 Java 代码
public static final void test301(@Nullable String name) {
Integer var1 = name != null ? name.length() : null;
boolean var2 = false;
System.out.println(var1);
}

其实Kotlin 最终的空安全还是靠 if-else 进行判断。

非空断言 !!.

类比 Java 中 Assert(断言),对象为空时,抛出 NPE 异常。

1
val len = name!!.length