2011-09-15 37 views
25

thể trùng lặp:
Java optional parametersJava constructor/method với tham số tùy chọn?

Tôi biết rằng trong PHP nếu bạn muốn gọi một hàm với các tham số ít bạn khai báo các chức năng như:

function foo(int param1, int param2 = "2"); 

và bây giờ Tôi có thể gọi foo(2)param2 sẽ được đặt thành 2.

Tôi đã cố gắng để làm điều này trong một nhà xây dựng Java nhưng có vẻ như nó không phải là có thể. Có cách nào để làm điều này hoặc tôi chỉ phải khai báo hai nhà thầu?

Cảm ơn!

+0

Tôi không quen với PHP, nhưng tại sao bạn không khai báo param2 bên trong phương thức? –

+2

trạng thái này là tham số tùy chọn, nếu bạn chỉ định param2 nó nhận giá trị bạn cung cấp, nếu không nó sẽ nhận giá trị "2" – luketorjussen

Trả lời

13

Java không hỗ trợ thông số mặc định. Bạn sẽ cần phải có hai nhà thầu để làm những gì bạn muốn.

Một giải pháp thay thế nếu có nhiều giá trị có thể có mặc định là sử dụng mẫu Builder, nhờ đó bạn sử dụng đối tượng trợ giúp có bộ định vị.

ví dụ:

public class Foo { 
    private final String param1; 
    private final String param2; 

    private Foo(Builder builder) { 
     this.param1 = builder.param1; 
     this.param2 = builder.param2; 
    } 
    public static class Builder { 
     private String param1 = "defaultForParam1"; 
     private String param2 = "defaultForParam2"; 

     public Builder param1(String param1) { 
     this.param1 = param1; 
     return this; 
     } 
     public Builder param2(String param1) { 
     this.param2 = param2; 
     return this; 
     } 
     public Foo build() { 
     return new Foo(this); 
     } 
    } 
    } 

cho phép bạn nói:

Foo myFoo = new Foo.Builder().param1("myvalue").build(); 

đó sẽ có giá trị mặc định cho param2.

+0

+1, nhưng ... trong đó * không * Java hỗ trợ các tham số mặc định? ;-) –

+0

:-) đủ công bằng. Sẽ chỉnh sửa. –

71

Java không có khái niệm về tham số tùy chọn với các giá trị mặc định hoặc trong hàm tạo hoặc trong phương thức. Bạn về cơ bản bị mắc kẹt với quá tải. Tuy nhiên, bạn dễ dàng xây dựng chuỗi nhà thầu nên bạn không cần phải lặp lại mã:

public Foo(int param1, int param2) 
{ 
    this.param1 = param1; 
    this.param2 = param2; 
} 

public Foo(int param1) 
{ 
    this(param1, 2); 
} 
+0

Câu trả lời này phải là câu trả lời được chấp nhận! –

0

Tại sao bạn muốn làm điều đó?

Tuy nhiên, Bạn có thể làm điều này:

public void foo(int param1) 
{ 
    int param2 = 2; 
    // rest of code 
} 

hay:

public void foo(int param1, int param2) 
{ 
    // rest of code 
} 

public void foo(int param1) 
{ 
    foo(param1, 2); 
} 
0

Bạn không thể có đối số tùy chọn mà mặc định cho một giá trị nhất định trong Java. Điều gần nhất với những gì bạn đang nói đến là java varargs theo đó bạn có thể chuyển một số lượng đối số tùy ý (cùng loại) cho một phương thức.

6

Bạn có thể mô phỏng nó bằng cách sử dụng varargs, tuy nhiên sau đó bạn nên kiểm tra nó cho quá nhiều đối số.

public void foo(int param1, int ... param2) 
{ 
    int param2_ 
    if(param2.length == 0) 
     param2_ = 2 
    else if(para2.length == 1) 
     param2_ = param2[0] 
    else 
     throw new TooManyArgumentsException(); // user provided too many arguments, 

    // rest of the code 
} 

Tuy nhiên cách tiếp cận này không phải là cách hay để thực hiện việc này, do đó tốt hơn là sử dụng quá tải.

2

Bạn có thể sử dụng varargs cho các thông số tùy chọn:

public class Booyah { 
    public static void main(String[] args) { 
     woohoo(1); 
     woohoo(2, 3); 
    } 
    static void woohoo(int required, Integer... optional) { 
     Integer lala; 
     if (optional.length == 1) { 
      lala = optional[0]; 
     } else { 
      lala = 2; 
     } 
     System.out.println(required + lala); 
    } 
} 

Ngoài ra, điều quan trọng cần lưu ý việc sử dụng Integer qua int. Integera wrapper around the primitive int, cho phép một người so sánh với null nếu cần.

Các vấn đề liên quan