Android 安卓开发语言kotlin与Java该如何选择

news2024/12/26 13:07:59

一、介绍

        如今在Android开发中,应用层开发语言主要是Java和Kotlin,Kotlin是后来加入的,主导的语言还是Java。kotlin的加入仿佛让会kotlin语言的开发者更屌一些,其实不然。

        有人说kotlin的引入是解决开发者复杂的逻辑,并且对空指针控制的比较友好,但是我们在开发过程中会发现,好像并不是这么回事,甚至有些开发者发现,在使用过程中会出现莫名其妙的错误,而且还不好定位。

        这时候,我们应该去分析,kotlin适不适合自己,自己能不能驾驭?

二、分析Java与kotlin实战中的利与弊

        学过政治都知道,任何东西都是一把双刃剑,既有好的一面也有不好的一面。不能什么都照搬过来。kotlin的好是建立在你已很好的掌握,但是不好的是你如果只会基础,在使用过程中,无法避免一些异常情况。但是Java的友好是适合新手使用,普及度高。

kotlin的弊端与分析

1、参数为null

参数为null这种很容易引起空指针,为什么会出现这种情况?是受Java的写法有关系

Java:

public void log(String txt)

Kotlin:

public fun log(txt:String)

正常Java你是可以传null进去,但是在kotlin,你传null就会报错

 分析:

Java中,你参数可以传任何,你传null也是没问题,但是你在kotlin中,就没有这么随意了,这是为什么呢?

 在kotlin中,任何参数都会被修饰,为空或者不为空,默认是NotNull。如果你不能传递null值过去。

如何避免?

只要我们是通过kotlin语法,你在任何参数申明都需要设置成为可为null

public fun log(txt:String?)

 

这个时候,在参数中,已变成可为null。

 

2、lateinit 报错未初始化先使用

        lateinit 是稍后初始化,这个只能做全局,不能出现在方法体,但是也有个问题。如果你用lateinit 修饰一个变量,那么这个变量可以不先申明变量值,等使用时再初始化。

但是这个也会出现一个问题,如果你没初始化就使用会报错

    lateinit var txt: String


    public fun log() {
        println(txt)
    }

        有人会说,我不能判空嘛?判空也不行。只要你使用之前就必须初始化,否则就会报错。这个问题在新手特别容易犯错。

 

        所以为什么这个关键字往往出现在修饰View的初始化使用比较多。这个在使用的时候进行判空,所以该字段默认为null,但是你使用必须要有值,只要你调用get方法就会触发。

思考:

有人会问,如果我直接修改变量的get方法,如果为null,那么get直接给他初始化。

 lateinit不允许修改set和get。

        但是Java就不会,Java是所见即所得,你的东西就是你的东西,kotlin是通过自己的语言限制,翻译成Java语言。所以,你不了解或者说不清楚目标类,很容易造成风险,并且这种bug被带到线上概率很大

3、参数类型强转"!!"导致null空指针

这种错误在方法调用很容易出现,而且这种BUG的概率非常高,导致项目质量很差。

public fun log(txt:String)

分析:

我们申请一个方法,参数不为null,在Java过程中,这种你不需要管,直接调用,一般对null的判断会在方法体中进行

Java:

public void log(String txt){

if(txt!=null){}

}

但是你在kotlin中,只能在调用处进行判断,否则就要将参数通过强制表示不为null,"!!"

我们在项目中进程遇到log(msg!!)这种错误的写法,这种写法,如果你的实参申请可以为null,但是形参不能为null,这个时候你只能通过"!!"来强转,但是:你的实参如果为null,这个时候就会报空指针,这是为什么?

这是因为你的实参在调用时已进行强制转换,也会提前进行空指针异常检查,所以在使用 "!!"强转符号时,一定要判空,否则会报错,但是Java中,我们随便传null。

4.形参为Val修饰的常量,无法修改

在kotlin中,形参是传值类型,你是无法直接修改变量,必须通过其他变量接收完再修改

 默认是Val类型
    public fun addOne(item:Int):Int{
     val  relVal=item+1
        return relVal
    }

5.默认为null的变量引用

默认值为null,如果变量已申请为这种,那么你以后的使用将离不开"?"和"!!"转换。

var temp:String?=null

这种区分全局和局部

1、全局:

如果是全局,对于IDE来说,任何时刻都有可能是null,所以在方法中使用,默认当成null来处理

 所以,你即使判空,还是不行。需要一辈子跟着"?"和"!!"搭配使用。

2、局部:

如果是局部,只要你在使用之前判断过一次,在合理的校验范围内都是有效

    public fun log(mm:String) {
        var txt:String?=null
        if (txt==null)
            return
        txt.length


    }

就是这种有起义的原因,导致在实战中,很多人很难理解

三、总结

        通过kotlin的自身问题,其实kotlin就是一种插件语言,最终还是翻译成Java,只是目前来看,通过翻译的目标类,还是Java本身,但是增加了特别多的校验,导致写法和Java有很大的不同。这种不同来自我们的习惯问题。有人提前判空,有人喜欢丢在使用出判空,调用处让语法自然一些。

        Android应用不像PC,空指针是致命的BUG,出现一个就会导致崩溃。所以,kotlin对空指针校验特别严格,也对使用埋下了隐患,新手可以绕开校验,但是对于绕开的原理不够理解,就会引起崩溃。

        kotlin也不是一无是处,他更像是一个插件,插件的好处是自然的,可扩展等也是kotlin的自身优势。

        所以,通过上面的分析,大家可以自行去选择项目中的语言,是kotlin还是Java,如果你向往kotlin的写法,那么就得去了解kotlin的原理,以及要改变自己在Java中的开发习惯。kotlin是先判断后使用,而Java写法很随意,由开发者自行定义,kotlin都是翻译好的。

最后,用好可以事半功倍,用不好,会引起各种不好排查的BUG。最后送一句话:水能载舟亦能覆舟。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/683938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【VSCode】设置关键字高亮的插件 | Highlight Word

目录 一、概述二、安装 highlight-words 插件三、配置 highlight-words 插件3.1 默认配置3.2 修改 settings.json 配置文件 四、设置高亮快捷键F8五、效果演示 一、概述 本文主要介绍在 VSCode 看代码时,怎样使某个单词高亮显示,主要通过以下三步实现&am…

Docker的run流程

底层原理 Docker怎么工作? Docker为什么比VM虚拟机块? 1.Docker有比虚拟机更少的抽象层 2.docker利用的是宿主机的内核,vm需要是Guest OS 所以说,新建一个容器的时候,docker不需要像虚拟机一样加载一个系统内核&am…

[conda]tf_agents和tensorflow-gpu安装傻瓜式教程

1.打开终端或Anaconda Prompt&#xff08;Windows用户&#xff09;。 2.输入以下命令创建新的Python环境&#xff1a; conda create --name <env_name> python<version>其中&#xff0c;<env_name>是您想要创建的环境名称&#xff0c;<version>是您想…

保留纵向连续性的迭代次数估算方法

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入有3个节点&#xff0c;训练集AB各由5张二值化的图片组成&#xff0c;让B全是0&#xff0c;让差值结构中有6个1.其中有3组 差值结构 A-B 迭代次数 行分布 列分布 0 1 1 0 1 1 3*5*1*2*0-0*0*0*0*0 3977.834 0 1 …

springboot中自定义JavaBean返回的json对象属性名称大写变小写问题

文章目录 springboot中自定义JavaBean返回的json对象属性名称大写变小写问题一、继承类二、手动添加Get方法三、JsonProperty四、spring-boot json(jackson)属性命名策略 springboot中自定义JavaBean返回的json对象属性名称大写变小写问题 开发过程中发现查询返回的数据出现自…

模拟电路系列分享-运放的关键参数3

目录 概要 整体架构流程 技术名词解释 1.输入电压范围 2.优劣范围: 3.理解 技术细节 1.共模抑制比 2.优劣范围 3.理解 小结 概要 提示&#xff1a;这里可以添加技术概要 实际运放与理想运放具有很多差别。理想运放就像一个十全十美的人&#xff0c;他学习100 分&#xff0c;寿…

chatgpt赋能python:Python中的相加功能函数:介绍、应用和示例

Python中的相加功能函数&#xff1a;介绍、应用和示例 Python是一个功能强大的编程语言&#xff0c;拥有许多强大的内置函数和模块。其中一个非常常见的功能是相加或者加法操作。让我们看一下Python中的相加功能函数。 什么是相加&#xff1f; 简而言之&#xff0c;相加是将…

6.17、进程与线程

比如&#xff0c;一边游戏&#xff0c;一边qq聊天&#xff0c;一边听歌&#xff0c;怎么设计&#xff1f; 进程 进程&#xff08;process&#xff09;&#xff1a;程序的一次执行过程&#xff0c;或是正在内存中运行的应用程序。如&#xff1a;运行中的QQ&#xff0c;运行中…

二叉树的基本操作(如何计算二叉树的结点个数,二叉树的高度)

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f…

内网隧道代理技术(八)之Python 反弹Shell

Python 反弹Shell Python介绍 Python由荷兰数学和计算机科学研究学会的吉多范罗苏姆于1990年代初设计&#xff0c;作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构&#xff0c;还能简单有效地面向对象编程。Python语法和动态类型&#xff0c;以及解释型语言的本…

月薪2万,被新同事15秒气走。

今年&#xff0c;AIGC掀起了巨浪&#xff0c;身边不少人感到前所未有的焦虑&#xff1a; 朋友圈好友晒出的AI美图&#xff0c;仅需15秒&#xff0c;竟比我2周的设计更出色&#xff1b; 公司用AI写的文案&#xff0c;转化率提升了10%&#xff0c;可能要优化人员了; 职场危机提前…

Boost序列化全解析

程序开发中&#xff0c;序列化是经常需要用到的。像一些相对高级语言&#xff0c;比如JAVA, C#都已经很好的支持了序列化&#xff0c;那么C呢&#xff1f;当然一个比较好的选择就是用Boost&#xff0c;这个号称C准标准库的东西。 什么时候需要序列化呢&#xff1f;举个例子&am…

可视化的工时管理:让项目进度真实可见

在现代项目管理中&#xff0c;工时表软件作为一种强大而有效的工具&#xff0c;能够帮助团队更好地管理项目进度。无论是大小型项目&#xff0c;正确使用工时表软件都可以提高团队的效率和项目的可追踪性。本文将介绍一些关键步骤&#xff0c;以帮助企业利用工时表软件来管理项…

【计算机图形学】期末总结大全,建议收藏

文章目录 一、图形学及其研究内容二、图形的输入设备和显示设备三、图形的显示设备四、显示子系统五、图形软件标准五、图形软件包六、习题七、直线段扫描转换算法八、直线段扫描转换算法练习题九、扫描线填充算法十、实区域填充算法十一、反走样技术十二、图形裁剪基础概念十三…

开源社区必会知识点— —git提交pr

开源社区必会 1 fork仓库并提交之后给开源社区提交pr 1.1 fork开源仓库 ①登录github&#xff0c;找到开源仓库A&#xff0c;然后点击fork 这样&#xff0c;就会在你自己github账号下创建一个同名的仓库B&#xff08;仓库名可修改&#xff09; ②然后本地修改&#xff0c;提…

[RocketMQ] Consumer消费者启动主要流程源码 (六)

客户端常用的消费者类是DefaultMQPushConsumer, DefaultMQPushConsumer的构造器以及start方法的源码。 1.创建DefaultMQPushConsumer实例 最终都是调用下面四个参数的构造函数: /*** 创建DefaultMQPushConsumer实例** param namespace namespace地址* par…

调用聚合数据API实现手机号码归属地查询

调用聚合数据API实现手机号码归属地查询 1&#xff0e;作者介绍2&#xff0e;相关介绍2.1 什么是聚合数据&#xff1f;2.2 API介绍2.3 手机号码归属地 3&#xff0e;实验过程3.1如何调用聚合数据API3.2代码实现3.3实验结果3.4问题分析 1&#xff0e;作者介绍 吝红凯&#xff0…

Python+requests+unittest+excel搭建接口自动化测试框架

一、框架结构&#xff1a; 工程目录 代码&#xff1a;基于python2编写 二、Case文件设计 三、基础包 base 3.1 封装get/post请求&#xff08;runmethon.py&#xff09; import requests import json class RunMethod:def post_main(self,url,data,headerNone):res Noneif h…

【C++】一些关于visual stdio,vscode,Mingw的思考 |bug

文章目录 今天在做YOLOV8的C部署时遇到的一些问题&#xff1a; 在进行一系列的操作之后会生成解决方案文件sln: 当然按道理到这一步之后&#xff0c;应该使用make命令进行下一步操作&#xff08;但是我确实不会make命令&#xff0c;所以准备进sln来生成解决方案&#xff09;&…

缓存和数据库一致性问题,看这篇就够了

阅读本文大约需要 10 分钟。 如何保证缓存和数据库一致性&#xff0c;这是一个老生常谈的话题了。 但很多人对这个问题&#xff0c;依旧有很多疑惑&#xff1a; 到底是更新缓存还是删缓存&#xff1f; 到底选择先更新数据库&#xff0c;再删除缓存&#xff0c;还是先删除缓存…