zm.blog

select * from learn


  • 首页

  • 标签

  • 分类

  • 归档

  • 关于

  • 搜索

Android Jetpack

发表于 2020-10-19 | 分类于 Android , Jetpack | | 阅读次数:

Jetpack是一套库、工具和指南,可帮助开发者更轻松地编写优质应用。这些组件可帮助您遵循最佳做法、让您摆脱编写样板代码地工作并简化复杂任务,以便将精力集中放在所需代码上。

Jetpack包含与平台API解除捆绑地androidx.*软件包库。这意味着,它可以提供向后兼容性,且比Android平台地更新频率更高,一次确保您始终可以获取最新且最好地Jetpack组件版本。

Android Jetpack组件

Android Jetpack组件是库的集合,这些库是为协同工作而构建的,不过也可以单独采用,同时利用Kotlin语言功能帮助您提高工作效率,可全部使用,也可混合搭配!

阅读全文 »

Kotlin入门

发表于 2020-09-26 | 分类于 Android , Kotlin | | 阅读次数:

image-20210116114509401

注意: Kotlin 现作为 Android 第一开发语言,AndroidStudio 作为 Google 的亲儿子,对 Kotlin 进行了完美的支持,开发提示应有尽有,因此下面所有的演示代码都是跑在 AndroidStudio 上的

阅读全文 »

Kotlin5种单列模式

发表于 2020-09-25 | 分类于 Android , Kotlin | | 阅读次数:

最近在学习Kotlin这门语言,在项目开发中,运用到了单例模式。因为其表达方式与Java是不同的。所以对不同单例模式的实现进行了分别探讨。主要单例模式实现如下:

  • 饿汉式
  • 懒汉式
  • 线程安全的懒汉式
  • 双重校验锁式
  • 静态内部类式

PS:该篇文章不讨论单例模式的运用场景与各种模式下的单例模式的优缺点。只讨论在Java下不同单例模式下的对应Kotlin实现。

一、饿汉式实现

1
2
3
4
5
6
7
8
9
10
11
12
13
//Java实现
public class SingletonDemo {
private static SingletonDemo instance=new SingletonDemo();
private SingletonDemo(){

}
public static SingletonDemo getInstance(){
return instance;
}
}

//Kotlin实现
object SingletonDemo

这里很多小伙伴,就吃了一惊。我靠一个object 关键字就完成相同的功能?一行代码?

  • Kotlin的对象声明

学习了Kotlin的小伙伴肯定知道,在Kotlin中类没有静态方法。如果你需要写一个可以无需用一个类的实例来调用,但需要访问类内部的函数(例如,工厂方法,单例等),你可以把该类声明为一个对象。

该对象与其他语言的静态成员是类似的。如果你想了解Kotlin对象声明的更多内容。请点击- - - 传送门(https://www.kotlincn.net/docs/reference/object-declarations.html#%E4%BC%B4%E7%94%9F%E5%AF%B9%E8%B1%A1)

到这里,如果还是有很多小伙伴不是很相信一行代码就能解决这个功能,我们可以通过一下方式查看Kotlin的字节码。

阅读全文 »

Kotlin委托

发表于 2020-09-19 | 分类于 Android , Kotlin | | 阅读次数:

委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。

Kotlin 直接支持委托模式,更加优雅,简洁。Kotlin 通过关键字 by 实现委托。


类委托

类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。

以下实例中派生类 Derived 继承了接口 Base 所有方法,并且委托一个传入的 Base 类的对象来执行这些方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 创建接口
interface Base {
fun print()
}

// 实现此接口的被委托的类
class BaseImpl(val x: Int) : Base {
override fun print() { print(x) }
}

// 通过关键字 by 建立委托类
class Derived(b: Base) : Base by b

fun main(args: Array<String>) {
val b = BaseImpl(10)
Derived(b).print() // 输出 10
}

在 Derived 声明中,by 子句表示,将 b 保存在 Derived 的对象实例内部,而且编译器将会生成继承自 Base 接口的所有方法, 并将调用转发给 b。


属性委托

属性委托指的是一个类的某个属性值不是在类中直接进行定义,而是将其托付给一个代理类,从而实现对该类的属性统一管理。

属性委托语法格式:

1
val/var <属性名>: <类型> by <表达式>
  • var/val:属性类型(可变/只读)
  • 属性名:属性名称
  • 类型:属性的数据类型
  • 表达式:委托代理类

by 关键字之后的表达式就是委托, 属性的 get() 方法(以及set() 方法)将被委托给这个对象的 getValue() 和 setValue() 方法。属性委托不必实现任何接口, 但必须提供 getValue() 函数(对于 var属性,还需要 setValue() 函数)。

阅读全文 »

Kotlin对象表达式和对象声明

发表于 2020-09-19 | 分类于 Android , Kotlin | | 阅读次数:

Kotlin 用对象表达式和对象声明来实现创建一个对某个类做了轻微改动的类的对象,且不需要去声明一个新的子类。


对象表达式

通过对象表达式实现一个匿名内部类的对象用于方法的参数中:

1
2
3
4
5
6
7
8
window.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) {
// ...
}
override fun mouseEntered(e: MouseEvent) {
// ...
}
})

对象可以继承于某个基类,或者实现其他接口:

1
2
3
4
5
6
7
8
9
open class A(x: Int) {
public open val y: Int = x
}

interface B {……}

val ab: A = object : A(1), B {
override val y = 15
}

如果超类型有一个构造函数,则必须传递参数给它。多个超类型和接口可以用逗号分隔。

通过对象表达式可以越过类的定义直接得到一个对象:

1
2
3
4
5
6
7
8
fun main(args: Array<String>) {
val site = object {
var name: String = "菜鸟教程"
var url: String = "www.runoob.com"
}
println(site.name)
println(site.url)
}

请注意,匿名对象可以用作只在本地和私有作用域中声明的类型。如果你使用匿名对象作为公有函数的 返回类型或者用作公有属性的类型,那么该函数或属性的实际类型 会是匿名对象声明的超类型,如果你没有声明任何超类型,就会是 Any。在匿名对象 中添加的成员将无法访问。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class C {
// 私有函数,所以其返回类型是匿名对象类型
private fun foo() = object {
val x: String = "x"
}

// 公有函数,所以其返回类型是 Any
fun publicFoo() = object {
val x: String = "x"
}

fun bar() {
val x1 = foo().x // 没问题
val x2 = publicFoo().x // 错误:未能解析的引用“x”
}
}

在对象表达中可以方便的访问到作用域中的其他变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fun countClicks(window: JComponent) {
var clickCount = 0
var enterCount = 0

window.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) {
clickCount++
}

override fun mouseEntered(e: MouseEvent) {
enterCount++
}
})
// ……
}
阅读全文 »

Kotlin枚举类

发表于 2020-09-19 | 分类于 Android , Kotlin | | 阅读次数:

枚举类最基本的用法是实现一个类型安全的枚举。

枚举常量用逗号分隔,每个枚举常量都是一个对象。

1
2
3
enum class Color{
RED,BLACK,BLUE,GREEN,WHITE
}

枚举初始化

每一个枚举都是枚举类的实例,它们可以被初始化:

1
2
3
4
5
enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
}

默认名称为枚举字符名,值从0开始。若需要指定值,则可以使用其构造函数:

1
2
3
4
enum class Shape(value:Int){
ovel(100),
rectangle(200)
}

枚举还支持以声明自己的匿名类及相应的方法、以及覆盖基类的方法。如:

1
2
3
4
5
6
7
8
9
10
11
enum class ProtocolState {
WAITING {
override fun signal() = TALKING
},

TALKING {
override fun signal() = WAITING
};

abstract fun signal(): ProtocolState
}

如果枚举类定义任何成员,要使用分号将成员定义中的枚举常量定义分隔开

阅读全文 »

Kotlin泛型

发表于 2020-09-19 | 分类于 Android , Kotlin | | 阅读次数:

Kotlin 泛型

泛型,即 “参数化类型”,将类型参数化,可以用在类,接口,方法上。

与 Java 一样,Kotlin 也提供泛型,为类型安全提供保证,消除类型强转的烦恼。

声明一个泛型类:

1
2
3
class Box<T>(t: T) {
var value = t
}

创建类的实例时我们需要指定类型参数:

1
2
3
val box: Box<Int> = Box<Int>(1)
// 或者
val box = Box(1) // 编译器会进行类型推断,1 类型 Int,所以编译器知道我们说的是 Box<Int>。

以下实例向泛型类 Box 传入整型数据和字符串:

1
2
3
4
5
6
7
8
9
10
11
class Box<T>(t : T) {
var value = t
}

fun main(args: Array<String>) {
var boxInt = Box<Int>(10)
var boxString = Box<String>("Runoob")

println(boxInt.value)
println(boxString.value)
}

输出结果为:

1
2
10
Runoob

定义泛型类型变量,可以完整地写明类型参数,如果编译器可以自动推定类型参数,也可以省略类型参数。

Kotlin 泛型函数的声明与 Java 相同,类型参数要放在函数名的前面:

1
2
3
4
5
fun <T> boxIn(value: T) = Box(value)

// 以下都是合法语句
val box4 = boxIn<Int>(1)
val box5 = boxIn(1) // 编译器会进行类型推断
阅读全文 »

Kotlin数据类与密封类

发表于 2020-09-19 | 分类于 Android , Kotlin | | 阅读次数:

数据类

Kotlin 可以创建一个只包含数据的类,关键字为 data:

1
data class User(val name: String, val age: Int)

编译器会自动的从主构造函数中根据所有声明的属性提取以下函数:

  • equals() / hashCode()
  • toString() 格式如 "User(name=John, age=42)"
  • componentN() functions 对应于属性,按声明顺序排列
  • copy() 函数

如果这些函数在类中已经被明确定义了,或者从超类中继承而来,就不再会生成。

为了保证生成代码的一致性以及有意义,数据类需要满足以下条件:

  • 主构造函数至少包含一个参数。
  • 所有的主构造函数的参数必须标识为val 或者 var ;
  • 数据类不可以声明为 abstract, open, sealed 或者 inner;
  • 数据类不能继承其他类 (但是可以实现接口)。

复制

复制使用 copy() 函数,我们可以使用该函数复制对象并修改部分属性, 对于上文的 User 类,其实现会类似下面这样:

1
fun copy(name: String = this.name, age: Int = this.age) = User(name, age)

实例

使用 copy 类复制 User 数据类,并修改 age 属性:

1
2
3
4
5
6
7
8
9
10
data class User(val name: String, val age: Int)


fun main(args: Array<String>) {
val jack = User(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2)
println(jack)
println(olderJack)

}

输出结果为:

1
2
User(name=Jack, age=1)
User(name=Jack, age=2)
阅读全文 »

Kotlin扩展

发表于 2020-09-18 | 分类于 Android , Kotlin | | 阅读次数:

Kotlin 扩展

Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 Decorator 模式。

扩展是一种静态行为,对被扩展的类代码本身不会造成任何影响。


扩展函数

扩展函数可以在已有类中添加新的方法,不会对原类做修改,扩展函数定义形式:

1
2
3
fun receiverType.functionName(params){
body
}
  • receiverType:表示函数的接收者,也就是函数扩展的对象
  • functionName:扩展函数的名称
  • params:扩展函数的参数,可以为NULL

以下实例扩展 User 类 :

1
2
3
4
5
6
7
8
9
10
11
class User(var name:String)

/**扩展函数**/
fun User.Print(){
print("用户名 $name")
}

fun main(arg:Array<String>){
var user = User("Runoob")
user.Print()
}

实例执行输出结果为:

1
用户名 Runoob

下面代码为 MutableList 添加一个swap 函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 扩展函数 swap,调换不同位置的值
fun MutableList<Int>.swap(index1: Int, index2: Int) {
val tmp = this[index1] // this 对应该列表
this[index1] = this[index2]
this[index2] = tmp
}

fun main(args: Array<String>) {

val l = mutableListOf(1, 2, 3)
// 位置 0 和 2 的值做了互换
l.swap(0, 2) // 'swap()' 函数内的 'this' 将指向 'l' 的值

println(l.toString())
}

实例执行输出结果为:

1
[3, 2, 1]

this关键字指代接收者对象(receiver object)(也就是调用扩展函数时, 在点号之前指定的对象实例)。


阅读全文 »

Kotlin接口

发表于 2020-09-18 | 分类于 Android , Kotlin | | 阅读次数:

Kotlin 接口

Kotlin 接口与 Java 8 类似,使用 interface 关键字定义接口,允许方法有默认实现:

1
2
3
4
5
6
7
interface MyInterface {
fun bar() // 未实现
fun foo() { //已实现
// 可选的方法体
println("foo")
}
}

实现接口

一个类或者对象可以实现一个或多个接口。

1
2
3
4
5
class Child : MyInterface {
override fun bar() {
// 方法体
}
}

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
interface MyInterface {
fun bar()
fun foo() {
// 可选的方法体
println("foo")
}
}
class Child : MyInterface {
override fun bar() {
// 方法体
println("bar")
}
}
fun main(args: Array<String>) {
val c = Child()
c.foo();
c.bar();

}

输出结果为:

1
2
foo
bar
阅读全文 »
1…345…38
ZhangMiao

ZhangMiao

Android/Flutter Developer

379 日志
58 分类
143 标签
RSS
E-Mail QQ Github StackOverflow
友情链接
  • Kaisir
  • Liujianhui
  • Leo
  • Hongyang
  • Liuwangshu
  • Jspang
  • Blankj
  • WuXiaoLong
  • Molunerfinn
  • Ofind
  • Gcssloop
© 2024 ZhangMiao
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4
本站访客数 人次 本站总访问量 次