Java có hỗ trợ default parameters không?

Rất tiếc câu trả lời là không! Java không hỗ trợ default parameters như những ngôn ngữ khác. Nhiều ngôn ngữ lập trình như C ++ hoặc JavaScript cho phép chúng ta đặt giá trị mặc định cho các tham số đầu vào của một method, chúng sẽ được sử dụng khi chúng ta thực hiện lời gọi hàm mà không truyền giá trị cho các tham số này.

Ví dụ default parameters trong JavaScript

function multiply(a, b = 1) {
  return a * b;
}

console.log(multiply(5, 2));
// expected output: 10

console.log(multiply(5));
// expected output: 5

Tuy nhiên, chúng ta vẫn có một số cách khác có thể đạt được tính năng tương tự như default parameters trong Java mà chúng ta sẽ cùng nhau tìm hiểu qua bài viết này.

Java default parameters

Như đã đề cập ở trên thì trong Java không hỗ trợ default parameters mà để đạt được điều tương tự thì chúng ta có thể áp dụng một số kỹ thuật trong Java như:

  • Method overloading
  • Null Value parameters

Method overloading

Method overloading là một kỹ thuật tốt nhất đã được được default parameters trong Java mà chúng ta có thể áp dụng.Method overloading là một tính năng cho phép một class có nhiều method cùng tên nhưng khác danh sách các tham số đầu vào. 

Chúng ta có 3 cách để implement method overloading

  • Thay đổi số lượng tham số lượng tham số đầu vào
  • Thay đổi kiểu dữ liệu của các tham số đầu vào
  • Thay đổi trình tự kiểu dữ liệu của các tham số đầu vào

Giả sử chúng ta có hàm search() nhận vào 3 tham số; query, limit và offset. Bây giờ nếu muốn sử dụng giá trị mặc định cho 2 tham số limit và offset – default parameters thì chúng ta có thể áp dụng method overloading như sau:

List<Document> search(String query, Integer limit, Integer offset) {
   // method implementation
}

List<Document> search(String query) {
   return search(query, 10, 0);
}

Null Value Parameters

Đối với cách này thì chúng ta vẫn phải truyền đủ các tham số mà một method yêu cầu. Tuy nhiên bên trong triển khai của method này sẽ xử lý kiểm tra các tham số có giá trị NULL thì sẽ gán giá trị mặc định cho chúng.

List<Result> search(String query, Integer limit, Integer offset) {
   if (limit == null) {
       limit = 10;
   }
   if (offset == null) {
       offset = 0;
   }
   // method implementation
}
There are

So với method overloading thì cách này có một bất tiện là chúng ta buộc phải truyền đầy đủ các tham số đầu vào khi thực hiện lời gọi hàm. Nó sẽ ít gần gũi hơn so với default parameters trong các ngôn ngữ khác như javascript, C.

 search("query", null, null)

Default parameters với method chứa nhiều parameter

Method overloading cho đến hiện tại có thể là lựa chọn tốt nhất. Tuy nhiên cách này sẽ trở nên phức tạp hơn khi một method có chứa quá nhiều parameters.

Để giải quyết vấn đề này chúng ta có thể tạo một wrapper class chứa tất cả các thuộc tính là các tham số đầu vào của một method. Bên trong wrapper này chúng ta có thể thoải moái triển khai default method.

Ví dụ chúng ta sẽ gom tất cả parameters của hàm search() vào SearchParams class.

class SearchParams {
 
   private static final int DEFAULT_LIMIT = 10;
   private static final int DEFAULT_OFFSET= 0;
 
   private String query;
   private int limit = SearchParams.DEFAULT_LIMIT;
   private int offset = SearchParams.DEFAULT_OFFSET;
 
   // getters
 
   }
 

Lúc này hàm search() sẽ được chỉnh sửa lại như sau

List<Result> search(SearchParams params) {
   // method implementation
}
There are

Sau khi đã khởi tạo wrapper class chúng ta sẽ áp dụng builder pattern để khởi tạo SearchParams object một cách tiện lợi và triển khai default parameters.

class SearchParams {
 
   // getters ...
 
   private SearchParams(Builder builder) {
       query = builder.query;
       limit = builder.limit;
       offset = builder.offset;
   }
 
   public static Builder newBuilder() {
       return new Builder();
   }
 
   public static final class Builder {
 
       private String query;
       private int limit;
       private int offset;
 
       private Builder() {
       }
 
       public Builder withQuery(String val) {
           query = val;
           return this;
       }
 
       public Builder withLimit(int val) {
           limit = val;
           return this;
       }
 
       public Builder withOffset(int val) {
           offset = val;
           return this;
       }
 
       public SearchParams build() {
           return new SearchParams(this);
       }
 
   }
 
}

Cuối cùng, chúng ta có thể sử dụng builder pattern để khởi tạo một SearchParams object với default parameters.

SearchParams params = SearchParams.newBuilder()
       .withQuery("gold")
       .withOffset(20)
       .build();
// params.limit = 10 by default

List<Result> results = search(params)

Chúng ta còn có thể áp dụng kỹ thuật này cho các method chứa nhiều tham số đầu vào làm để làm giảm sự phức tạp khi khai báo và sử dụng. Ngoài ra default method vẫn có thể được áp dụng trong kỹ thuật này tùy thuộc vào yêu cầu dự án.

Tóm lược

Qua bài viết này chúng ta đã biết được rằng java không hỗ trợ default parameters thay vào đó chúng ta có thể áp dụng các kỹ thuật khác trong Java để đạt được tính năng tương tự như method overloading, null values parameter, wrapper và builder pattern.

Nguồn tham khảo

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Default_parameters

https://www.baeldung.com/java-default-parameters-method-overloading

http://dolszewski.com/java/java-default-parameters/

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x