parameter - Java是否支持默認參數值?




java method optional parameter (13)

我遇到了一些具有以下結構的Java代碼:

public MyParameterizedFunction(String param1, int param2)
{
    this(param1, param2, false);
}

public MyParameterizedFunction(String param1, int param2, boolean param3)
{
    //use all three parameters here
}

我知道在C ++中,我可以為參數分配一個默認值。 例如:

void MyParameterizedFunction(String param1, int param2, bool param3=false);

Java是否支持這種語法? 有沒有任何理由為什麼這兩個步驟的語法是可取的?


,但最簡單的實現方法是:

public MyParameterizedFunction(String param1, int param2, Boolean param3) {

    param3 = param3 == null ? false : param3;
}

public MyParameterizedFunction(String param1, int param2) {

    this(param1, param2, false);
}

或者,您可以使用三元運算符而不是以下情況:

public MyParameterizedFunction(String param1, int param2, Boolean param3) {

    if (param3 == null) {
        param3 = false;
    }
}

public MyParameterizedFunction(String param1, int param2) {

    this(param1, param2, false);
}

不。通常,Java沒有太多(任何)語法糖,因為他們試圖製作一種簡單的語言。


不,但你可以很容易地模仿他們。 在C ++中是什麼:

public: void myFunction(int a, int b=5, string c="test") { ... }

在Java中,它將是一個重載函數:

public void myFunction(int a, int b, string c) { ... }

public void myFunction(int a, int b) {
    myFunction(a, b, "test");
}

public void myFunction(int a) {
    myFunction(a, 5);
}

早些時候曾經提到,默認參數在函數重載中引起了不明確的情況。 這是不正確的,我們可以看到在C ++的情況下:是的,也許它可以創建不明確的情況,但這些問題可以很容易地處理。 它只是沒有在Java中開發,可能是因為創建者想要一個更簡單的語言,因為C ++是 - 如果他們有權利的話,是另一個問題。 但是我們大多數人不認為他使用Java是因為它的簡單性。


不,但您可以使用Builder模式如此堆棧溢出答案中所述

正如鍊接答案中所述,Builder模式允許您編寫類似的代碼

Student s1 = new StudentBuilder().name("Eli").buildStudent();
Student s2 = new StudentBuilder()
                 .name("Spicoli")
                 .age(16)
                 .motto("Aloha, Mr Hand")
                 .buildStudent();

其中一些字段可以具有默認值或者是可選的。


不,您發現的結構是Java如何處理它(即,使用重載而不是默認參數)。

對於構造函數,如果重載變得複雜, 請參閱“有效Java:編程語言指南”的第1項技巧(考慮靜態工廠方法而不是構造函數)。 對於其他方法,重命名某些情況或使用參數對象可以提供幫助。 這是當你有足夠的複雜性,差異化是困難的。 一個確定的情況是你必須使用參數順序進行區分,而不僅僅是數字和類型。


可悲的是沒有。


在Java 8中工作的一種類似於https://.com/a/13864910/2323964方法是使用帶有默認獲取器的接口。 這將會有更多的空白,但是可以嘲弄,而且當你有很多實際需要關注參數的實例時,這非常棒。

public class Foo() {
    public interface Parameters {
        String getRequired();
        default int getOptionalInt(){ return 23; }
        default String getOptionalString(){ return "Skidoo"; }
    }

    public Foo(Parameters parameters){
        //...
    }

    public static void baz() {
        final Foo foo = new Foo(new Person() {
            @Override public String getRequired(){ return "blahblahblah"; }
            @Override public int getOptionalInt(){ return 43; }
        });
    }
}

它不被支持,但有幾個選項,如使用一些語法糖使用參數對像模式:

public class Foo() {
    private static class ParameterObject {
        int param1 = 1;
        String param2 = "";
    }

    public static void main(String[] args) {
        new Foo().myMethod(new ParameterObject() {{ param1 = 10; param2 = "bar";}});
    }

    private void myMethod(ParameterObject po) {
    }
}

在這個示例中,我們使用默認值構造ParameterObject ,並在類實例初始化部分{ param1 = 10; param2 = "bar";} { param1 = 10; param2 = "bar";}


您可以在Scala中執行此操作,該操作在JVM上運行,並且與Java程序兼容。 http://www.scala-lang.org/

class Foo(var prime: Boolean = false, val rib: String)  {}

我可能會在這裡指出明顯的,但為什麼不自己實現“默認”參數呢?

public class Foo() {
        public void func(String s){
                func(s, true);
        }
        public void func(String s, boolean b){
                //your code here
        }
}

對於你將使用的默認值

func(“我的字符串”);

如果你不想使用默認值,你可以使用

func(“我的字符串”,false);


有這麼多問題或更好的問題,最終你會到達靜態工廠模式......請參閱crypto API。 排序很難解釋,但這樣想:如果你有一個構造函數,默認或其他方式,將狀態傳播到花括號之外的唯一方法是使用布爾isValid; (以null作為默認值v失敗的構造函數),或者拋出一個從現場用戶獲取時從不提供信息的異常。

代碼正確的被詛咒,我寫成千行的構造函數,並做我需要的。 我發現在對象構造中使用isValid - 換句話說,是兩個線構造函數 - 但由於某種原因,我正在遷移到靜態工廠模式。 我只是覺得如果你在方法調用中可以做很多事情,仍然存在sync()問題,但是默認值可以更好地被替代(更安全)

我認為我們在這裡需要做的是解決null作為缺省值的問題,而不是針對某些事情。String one = new String(“”); 作為成員變量,然後在分配傳遞給構造函數的字符串之前檢查null。

Java中完成的原始平流層計算機科學數量非常顯著。

C ++等有供應商庫,是的。 由於其大規模的工具箱,Java可以在大型服務器上超越它們。 學習靜態初始化塊,留在我們身邊。


沒有。

您可以通過傳遞具有智能默認值的對象來實現相同的行為。 但這又取決於你的情況。


這就是我所做的......它不像對你定義的參數有'可選參數'那樣方便,但它完成了工作:

public void postUserMessage(String s,boolean wipeClean)
{
    if(wipeClean)
    {
        userInformation.setText(s + "\n");
    }
    else
    {
        postUserMessage(s);
    }
}

public void postUserMessage(String s)
{
    userInformation.appendText(s + "\n");
}

注意我可以用一個字符串調用相同的方法名,或者我可以用一個字符串和一個布爾值來調用它。 在這種情況下,將wipeClean設置為true會將我TextArea中的所有文本替換為提供的字符串。 將wipeClean設置為false或將它們全部放在一起只需將提供的文本附加到TextArea。

另外請注意,我不是在這兩種方法中重複代碼,我只是添加了能夠通過僅使用添加的布爾值創建具有相同名稱的新方法來重置TextArea的功能。

我實際上認為這比Java為參數提供了一個'可選參數'要乾淨一點,因為我們需要編碼默認值等。在這個例子中,我不必擔心這些。 是的,我已經為班上增加了另一種方法,但從長遠來看,我認為更容易閱讀。





method-overloading