Kotlin系列之消除函数重载

标签: kotlin      消除函数重载


目录:


一、函数重载的带来问题

  • 1、遇到问题

    无论是在Java或者C++中都有函数重载一说,函数重载目的为了针对不同功能业务需求,然后暴露不同参数的接口,包括参数列表个数,参数类型,参数顺序。但是这些参数不同的调整无疑会增加更多同名的函数,对于外部调用者特别的confused. 很容易出现调用错误,特别当存在参数个数相同,只是参数类型不同,就很容易出错。

    请看以下例子(以Thread类为例):

    public class Thread{
    
     public Thread() {
        init(null, null, "Thread-" + nextThreadNum(), 0);
     }
     
     public Thread(Runnable target) {
        init(null, target, "Thread-" + nextThreadNum(), 0);
     }
     
     public Thread(ThreadGroup group, Runnable target) {
        init(group, target, "Thread-" + nextThreadNum(), 0);
     }
     
     public Thread(ThreadGroup group, Runnable target, String name) {
        init(group, target, name, 0);
     }
    
    
    }
    
    class ThreadTest{
       public static void main(String[] args){
          Thread thread1 = new Thread();
          
          Thread thread2 = new Thread(new Runnable() {
    		@Override
    		public void run() {//todo
    
    		}
    	});
    	
    	  Thread thread3 = new Thread(null, new Runnable() {
    		@Override
    		public void run() {//todo
    
    		}
    	});
    	
           Thread thread4 = new Thread(null, new Runnable() {
    		@Override
    		public void run() {//todo
    
    		}
    	}, "thread_test")  
       }
    }
    
    
  • 2、解决问题

    由以上的问题,我们知道在Java中会出现很多重载方法,如果调用错误了,也许我们会把这个问题归结于自身不够严谨,可谁曾想过如果一门好的语言是能够在语法上就很明确并且在语法上减少一些错误。然而Kotlin这门语言就在方面优越于Java,它语法的层面上就降低了代码犯错可能。

解决以上问题就是利用Kotlin中的函数命名参数和默认值参数就能彻底消除函数重载的问题。

Kotlin解决例子:

 class Thread(group: ThreadGroup? = null,
                   target: Runnable? = null,
                       name: String? = null)
  : Runnable{
      init(group, target, name, 0)
 }
 
 fun main(agrs: Array<String>){
    val thread1= Thread()
    val thread2 = Thread(target = object: Runnable{
          override fun run() {
				//todo
	    }
      })
    val thread3 = Thread(target = object: Runnable{
          override fun run() {
				//todo
	    }
      }, name = "therad_test")  
 }

二、Kotlin中的函数命名参数

我们需要关注的第一个问题就是函数的可读性,然而函数命名参数的出现就是为了解决函数的可读性,准确来说是为了让调用者更加具有可读性。

  • 定义

    在Kotlin中,当调用一个Kotlin定义的函数时,可以显示地标明一些参数的名称,而且可以打乱顺序参数调用顺序,因为可以通过参数名称就能唯一定位具体对应参数。

  • Java中调用的例子

    //定义一个Java函数
    public static String joinToString(Collection<T> collection, String prefix, String seperataor, String postfix){
     //...
    }
    
    //调用
    joinToString(collection, " ", " "," ")
    

    由以上Java中调用joinToString方法其实就比较confused,特别是后面三个空格但从调用的地方根本就无法知道joinToString方法对应的参数是哪个,每个值具体意思是什么,那么就值得你去尝试一下kotlin了。

  • Kotlin中调用的例子

//函数使用默认值参数 可以消除重载
@JvmOverloads
fun joinString(
collection: Collection,
separator: String,
prefix: String,
postfix: String
): String {
return collection.joinToString(separator, prefix, postfix)
}

//调用
fun main(args: Array) {
println(joinString(collection = listOf(1, 2, 3, 4), separator = “%”, prefix = “<”, postfix = “>”))
}

> 实际上单单靠命名参数是不能解决函数重载的,命名函数只是纯粹地为了函数调用更加明确和调用者传入的值可以与声明函数的参数对应。要想解决函数重载问题得靠默认值参数来解决  

<h3 id = "3">三、Kotlin中的函数默认值参数</h3>

> 当我们在处
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊喵先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值