Kotlinベース11関数のデフォルト値

5208 ワード

Kotlinベース11関数のデフォルト値
関数のデフォルト
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  joinToString(
        collection: Collection,
        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) {
    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 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) {
    println(joinToString(listOf("c++", "Java","Python", "Kotlin"), postfix = "..."))
}
//result:
c++, Java, Python, Kotlin...

Process finished with exit code 0