【延伸Android必备知识点】
【Android部分高级架构视频学习资源】
**Android精讲视频学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水!
**任何市场都是优胜略汰适者生存,只要你技术过硬,到哪里都不存在饱和不饱和的问题,所以重要的还是提升自己。懂得多是自己的加分项 而不是必须项。门槛高了只能证明这个市场在不断成熟化!**另外一千个读者就有一千个哈姆雷特,所以以上只是自己的关键,不喜勿喷!
如果你是卡在缺少学习资源的瓶颈上,那么刚刚好我能帮到你。欢迎关注会持续更新和分享的。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
/// Kotlin
class ExampleTest {
@Test
fun testMethod1() {}
@Test
fun testMethod2() {}
}
在 Kotlin 里需要注意:
- 方法与类的默认修饰符类型是 Public
- 函数定义中如果返回值是空 (void) 的话可以忽略
- 没有检查性异常
分号是可选项
这个特性一开始可能会让您不适应。但是在实践中,您不需要有过多的担心。您可以按照以前的编程习惯使用分号,而且不会影响到代码的编译过程,但 IDE 会自动找出这些可删除的分号并提示您。只需要在提交代码之前删掉就可以了。
无论您喜欢与否,Java 已经在某些地方早就不使用分号了,如果跟 C++ 对比的话会更明显 (因为 C++ 使用分号的场景更多)。
/// C++
std::thread([this] { this->DoThreadWork(); });
/// Java
new Thread(() -> doThreadWork());
/// Kotlin
Thread { doThreadWork() }
在尾部声明类型
/// Java
int value = 10;
Entry add(String name, String description)
/// Kotlin
var value: Int = 10
fun add(name: String, description: String): Entry
和分号是可选项类似,如果您还没有习惯使用这个特性的话,可能会让您难以接受,它与很多人在他们编程生涯中遇到过的类型声明相比,这里的顺序正好相反。
但这个语法带来的好处是,如果变量类型是可以自动被推测出来的话,此时可以直接跳过类型声明。这个特性在后面的 “省略变量类型” 章节里有介绍。
还有个好处是可以把更多的注意力放在变量本身而不是它的类型上。而且我发现在讨论代码的时候,类型在后的顺序听起来更自然 (从英文语言角度)。
/// Java
int result; // 整数型的变量,名字叫 “result”
/// Kotlin
var result: Int // 变量名字叫 “result” ,是整数型
对此语法我想说的最后一件事情是,虽然一开始您可能感觉不适,但是随着使用频率的增加,您慢慢会习惯。
没有 new 关键字的构造函数
Kotlin 中不需要使用 new 关键字调用构造函数。
/// Java
… = new SomeClass();
/// Kotlin
… = SomeClass()
起初这会让您觉得漏掉了关键信息 (指创建内存的操作),但不需要担心。因为在 Java 中,有些函数会在您不知情的情况下创建内存。对此,您从来也没有关心过 (也不需要关心)。很多函数库甚至还有创建内存的静态方法,比如:
/// Java
Lists.newArrayList();
Kotlin 只是统一了函数的这种行为。因为对一个函数来说,无论分配内存与否,这只是它的附加效果而已,并不影响函数调用。
而且它还简化了创建对象只是为了调用其方法的写法。
/// Java
new Thread(…).start(); // 有点奇怪但是是可以这样写的
/// Kotlin
Thread(…).start()
可变性与不可变性
在 Java 中变量默认是可变的,使用 final 关键字可以使变量为不可变。与之相反,在 Kotlin 中是没有 final 关键字。您需要使用 val 关键字指示变量是不可变的,使用 var 关键字指示变量是可变的。
/// Java
private final Project project; // 初始化之后无法再赋值
private Module activeModule; // 初始化之后可以再赋值
/// Kotlin
private val project: Project // 初始化之后无法再赋值
private var activeModule: Module // 初始化之后可以再赋值
在 Java 中您可能会经常遇到很多成员变量应该是常数,但是却没有使用 final 关键字 (忘记加上 final 是容易犯的错误)。在 Kotlin 中您必须显式地声明每个成员变量的类型。如果您一开始不确定该选择哪种类型,那就默认使用 val 类型,后面有需求变化时再改为 var。
顺便说一句,在 Java 中函数参数类型是可变的,但是可以使用 final 关键字修改为不可变。在 Kotlin 中,函数参数始终是不可变的,它们是被 val 关键字隐式地标记为不可变。
/// Java
public void log(final String message) { … }
/// Kotlin
fun log(message: String) { … } // “message” is immutable
可空性
Kotlin 中取消了 @NotNull 跟 @Nullable 的注解方法。如果变量可以赋值为 null,您只需要在变量类型后面加上一个 “?” 就可以了:
/// Java
@Nullable Project project;
@NotNull String title;
/// Kotlin
val project: Project?
val title: String
在某些情况下,当您确定某些可以被赋值为 null 的变量不可能是 null,您可以使用 !! 操作符设置一个断言。
/// Kotlin
// ‘parse’ 可以返回 null,但这条用例总是能够运行
val result = parse(“123”)!!
// 下面这行是多余的,因为 !! 已经触发断言了
❌ assertThat(result).isNotNull()
如果您错误地使用了 !!,它有可能会抛出 NullPointerException 的异常。在单元测试中,这只会造成测试用例的失败,但是在生产环境中,可能会使程序崩溃,所以要非常小心。事实上,在生产环境的代码中有太多的 !! 操作符,可能意味着此处有 “代码异味” (“代码异味” 代表这部分代码可能需要审查或重构)。
在单元测试中,测试用例里使用 !! 操作符是可接受的,原因是当假设不成立的时候测试用例会失败,并且您还可以修复它。
如果您确定使用 !! 操作符是有意义的,那尽量靠前使用,如下面的用法:
/// Kotlin
val result = parse(“…”)!!
result.doSomething()
result.doSomethingElse()
下面是错误用法:
/// Kotlin (自动生成)
val result = parse(“…”)
❌ result!!.doSomething()
❌ result!!.doSomethingElse()
可省略变量的类型
在 Java 中会看到如下写法的代码:
/// Java
SomeClass instance1 = new SomeClass();
SomeGeneric<List> instance2 = new SomeGeneric<>();
在 Kotlin 中,类型声明被认为是冗余的操作,不需要写两次:
/// Kotlin
val instance1 = SomeClass()
val instance2 = SomeGeneric<List>()
然而,我们在使用动态绑定的时候可能会需要声明这些类型:
/// Java
BaseClass instance = new ChildClass(); // 如:List = new ArrayList
在 Kotlin 中使用下面语法达到同样目的:
/// Kotlin
val instance: BaseClass = ChildClass()
没有检查性异常
不像 Java 那样,Kotlin 中的类方法不需要声明自己的异常类型。因为在 Kotlin 中检查性异常 (Checked Exception) 跟运行时异常 (Runtime Exception) 之间是没有区别的。
/// Java
public void readFile() throws IOException { … }
/// Kotlin
fun readFile() { … }
但是为了使 Java 可以调用 Kotlin 的代码,Kotlin 还是提供 @Throws 注解功能,用于隐式的声明异常类型。当执行 Java → Kotlin 转换时,IDE 会保证安全性并且始终包含这类信息。
/// Kotlin (从 Java 自动转换而来)
@Throws(Exception::class)
fun testSomethingImportant() { … }
但您不需要担心您的单元测试会被 Java 类调用。因此,您可以安全地删除这些类型声明而且还可以减少代码行数:
/// Kotlin
fun testSomethingImportant() { … }
Lambda 调用时可以省略括号
在 Kotlin 中,如果您想要把一个闭包赋值给变量,您需要显式地声明它的类型:
val sumFunc: (Int, Int) -> Int = { x, y -> x + y }
如果所有类型是可以被推测的,则可以简写成:
{ x, y -> x + y }
举个例子:
val intList = listOf(1, 2, 3, 4, 5, 6)
val sum = intList.fold(0, { x, y -> x + y })
需要注意的是,如果一个函数调用的最后一个参数是 lambda 调用时,这时候可以把闭包写在函数括号的外面。
总结
找工作是个很辛苦的事情,而且一般周期都比较长,有时候既看个人技术,也看运气。第一次找工作,最后的结果虽然不尽如人意,不过收获远比offer大。接下来就是针对自己的不足,好好努力了。
最后为了节约大家的时间,我把我学习所用的资料和面试遇到的问题和答案都整理成了PDF文档
喜欢文章的话请关注、点赞、转发 谢谢!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
链图片转存中…(img-7bxukTLB-1715632985576)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!