Kotlin基础十一函数默认值


函数默认值

  周所周知,Java语言并不支持参数使用默认值。有人说这是因为“默认参数”“方法重载”同时支持的话有二义性的问题,具体真正的原因我不得而知。但是对我个人来说,Java不支持这个特性的确挺让我蛋疼的,虽然说使用方法重载也可以间接实现与默认参数这个特性相同的功能,但这就意味着你得写更多的代码……
  关于这一点,有人说:

假设 Java 支持默认参数,则对于下面的代码

public int add(int a) {
    // do something 
}

public int add(int a, int b = 0) {
    // do something 
} 

当执行 add(12) ,你说是调用的 int add(int a) 还是 int add(int a, int b = 0)?

  对于这么干人的我不知道该说什么好了,你既然定义了public int add(int a, int b = 0)还定义public int add(int a)干什么,不是多此一举吗。在C++里面这么干会报错,原因就是产生了二义性问题。就像我说的,定义了public int add(int a, int b = 0)还定义public int add(int a)干什么,多此一举,换句话来说,这种问题是完全可以避免的,同时我们还能使用默认参数的特性和享受它的方便,不用再写多余的代码。很高兴,我们的Kotlin也支持这一特性:

@JvmOverloads //<1>
fun <T> joinToString(
        collection: Collection<T>,
        separator: String = ", ",
        prefix: String = "",
        postfix: String = ""
): String {
    val result = StringBuilder(prefix)

    for ((index, element) in collection.withIndex()) {
        if (index > 0) result.append(separator)
        result.append(element)
    }
    result.append(postfix)
    return result.toString()
}

fun main(args: Array<String>) {
    println(joinToString(listOf("c++", "Java","Python", "Kotlin")))
} //result:
c++, Java, Python, Kotlin

Process finished with exit code 0

  眼神犀利的同学们应该已经注意到了@JvmOverloads这个声明。那么这是干什么用的呢?没错,刚才我们不是说Java不支持默认参数吗,这个声明就是告诉Java编译器编译这个类时,生成对应的重载函数,这样一来这个函数就可以在Java中使用了,不用我们自己再写任何代码:
  

public class DefaultPara {
    //error public void print(String s = "1234")
    public void print(String s) {
        System.out.println(s);
    }
    public static void main(String ...args) {
        new DefaultPara().print("dasdsa");
        String[] str = {"c++", "Java","Python", "Kotlin"};
        ArrayList<String> list = new ArrayList<>();
        for (String s : str) {
            list.add(s);
        }
        System.out.println(Kt34Kt.joinToString(list));
    }
}
//result:
dasdsa
c++, Java, Python, Kotlin

Process finished with exit code 0

  用过Python的同学可能还有疑问,既然支持默认参数,那支不支持指定参数传值呢?答案是肯定的:

fun main(args: Array<String>) {
    println(joinToString(listOf("c++", "Java","Python", "Kotlin"), postfix = "..."))
}
//result:
c++, Java, Python, Kotlin...

Process finished with exit code 0