Kotlin中如何实现类似Java或C#中的静态方法,本文总结了几种方法,分别是:包级函数、伴生对象、扩展函数和对象声明。这需要大家根据不同的情况进行选择。
大家可以在网络上搜到不少这样的文章,官方推荐是包级函数,也有人说用伴生对象(companion class)。这些都是不错的选择,但并不完善,我们在不同的情况下有更好的选择。我总结了几种方法,分别是:包级函数、伴生对象、扩展函数和对象声明。这需要大家根据不同的情况进行选择。
一、包级函数
Kotlin和Java及C#不同的是,可以在包里面直接声明函数。做法和类中是一样的,这里就不多说了,的确是一个非常好的选择。适用于函数不需要不包内部的类进行数据共享的方法。
二、伴生对象
从语义上来讲,伴生函数与Java中静态方法最为相近,所以用伴生对象完全可以实现Java中静态类的所有内容。但在Java中使用静态方法有时是没有办法的选择,在Kotlin中伴生对象只是我们的一种选择。下面我就介绍一下伴生对象。
大家在使用Java的时不知有没有注意到,Java类中的静态变量及方法是在什么时候初始化的?是在静态方法第一次调用时还是在相应的Java类被加载时?答案是在Java类被加载时(也就是说如果你调用过Java类中的实例变量及方法后,即使你没有使用静态变量及方法,静态变量已经初始化了)。这种现象用伴生来描述是不是很贴切。
在Kotlin中,认为一个类中有两类东东,一类是Java类中的实例变量及方法,另一类是Java类中的静态变量及方法。Kotlin将静态实例及方法统一打包到一个伴生类中,就是这个样子啦。下面给出一个例子:
fun main(args: Array<String>) { Books.getBestSellers() } class Books(var name: String, val page: Int) { fun getWordCount()=page*100 companion object ComBooks{ var bestSellers=arrayOf("Harry Potter\r\t","Lord of the Rings\r\t") fun getBestSellers() { bestSellers.forEach{v->println(v)} } } }
伴生类是用companion来声明的,他在伴生对象所在的类被加载,伴生对象被初始化,与Java静态成员一样。其可以匿名或者与包含他的类类名相同。调用有两种: Books.ComBooks.getBestSellsers()?
或 Books.getBestSellsers()?。
三、扩展函数
在Java中,我们经常用写Utils类,这些类往往都是针对某一个对象对其功能进行与自身程序相匹配的操作。其中的方法以静态方法居多,比方说:
public class Utils { public static boolean isEmpty(String string){ return string != null && string.length() == 0; } public static boolean isWeakEmpty(String string){ return isEmpty(string) && string.trim().length() == 0; } }
我们当然可以用上面的两种方法来实现这些静态方法,但是我们有更好的方法。
fun String.isEmpty() = this != null && this.length == 0; fun String.isWeakEmpty()= this.isEmpty() && this.trim().length == 0
上面两行代码给String这个类扩展了两个函数,这两个函数就可以像其原生函数一样调用,代码十分优美。其实扩展函数并没有修改String类内部的东东,也只是给String加了两个静态函数,但相比Java的Utils类,可读性有了非常大的提高。
四、对象声明
继续考虑上面的Utils类,这个类中所有的方法(有时也有可能有变量)都是静态的,这个方法根本没有必要实例化,在Java中我们经常将此种类声明为静态类,在Kotlin中针对这种情况有没有好的对应方案呢?有没有比伴生对象更好的方案呢?当然是有的,对象声明就是一种。
对象声明非常好理解,就是用object关键字声明了一个对象,对象里面可以用变量也可以有方法,如:
object AppInfo{ var AppName = "Kotlin Message" var AppAuthor = "Riley Ge" fun toSimpleString() { println("AppName:$AppName,AppAuthor:$AppAuthor") } }
发现Kotlin的对象真是强大!有一点大家注意一下,AppInfo是在第一次被访问到时延迟初始化的,也就是说在对象声明时AppInfo并没有初始化。
五、总结
说了这么多方法,现在没有人在担心Kotlin没有静态方法了吧,Kotlin没有只是因为他可以做的更好。而且Kotlin也给了大家更多的选择,大家可以根据自己的实际情况选用合适的方法,让自己的代码高效而优美。
以上是详解Kotlin中如何实现类似Java或C#中的静态方法的详细内容。更多信息请关注PHP中文网其他相关文章!

如何将C#.NET应用部署到Azure或AWS?答案是使用AzureAppService和AWSElasticBeanstalk。1.在Azure上,使用AzureAppService和AzurePipelines自动化部署。2.在AWS上,使用AmazonElasticBeanstalk和AWSLambda实现部署和无服务器计算。

C#和.NET的结合为开发者提供了强大的编程环境。1)C#支持多态性和异步编程,2).NET提供跨平台能力和并发处理机制,这使得它们在桌面、Web和移动应用开发中广泛应用。

.NETFramework是一个软件框架,C#是一种编程语言。1..NETFramework提供库和服务,支持桌面、Web和移动应用开发。2.C#设计用于.NETFramework,支持现代编程功能。3..NETFramework通过CLR管理代码执行,C#代码编译成IL后由CLR运行。4.使用.NETFramework可快速开发应用,C#提供如LINQ的高级功能。5.常见错误包括类型转换和异步编程死锁,调试需用VisualStudio工具。

C#是一种由微软开发的现代、面向对象的编程语言,.NET是微软提供的开发框架。C#结合了C 的性能和Java的简洁性,适用于构建各种应用程序。.NET框架支持多种语言,提供垃圾回收机制,简化内存管理。

C#和.NET运行时紧密合作,赋予开发者高效、强大且跨平台的开发能力。1)C#是一种类型安全且面向对象的编程语言,旨在与.NET框架无缝集成。2).NET运行时管理C#代码的执行,提供垃圾回收、类型安全等服务,确保高效和跨平台运行。

要开始C#.NET开发,你需要:1.了解C#的基础知识和.NET框架的核心概念;2.掌握变量、数据类型、控制结构、函数和类的基本概念;3.学习C#的高级特性,如LINQ和异步编程;4.熟悉常见错误的调试技巧和性能优化方法。通过这些步骤,你可以逐步深入C#.NET的世界,并编写高效的应用程序。

C#和.NET的关系是密不可分的,但它们不是一回事。C#是一门编程语言,而.NET是一个开发平台。C#用于编写代码,编译成.NET的中间语言(IL),由.NET运行时(CLR)执行。

C#.NET依然重要,因为它提供了强大的工具和库,支持多种应用开发。1)C#结合.NET框架,使开发高效便捷。2)C#的类型安全和垃圾回收机制增强了其优势。3).NET提供跨平台运行环境和丰富的API,提升了开发灵活性。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

禅工作室 13.0.1
功能强大的PHP集成开发环境

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

SublimeText3汉化版
中文版,非常好用