2013-08-01 31 views
15

Có thể đặt tên tham số với giá trị mặc định trong groovy không? Kế hoạch của tôi là tạo một loại nhà máy đối tượng, có thể được gọi là không có đối số nào để có được một đối tượng với các giá trị mặc định. Ngoài ra, tôi cần các chức năng để thiết lập một cách rõ ràng bất kỳ params cho đối tượng. Tôi tin rằng điều này là có thể với các đối số từ khóa Python, ví dụ.thông số được đặt tên có giá trị mặc định trong groovy

Mã Tôi đang cố gắng với ngay bây giờ là một cái gì đó như dưới đây

// Factory method 
def createFoo(name='John Doe', age=51, address='High Street 11') { 
    return new Foo(name, age, address) 
} 

// Calls 
Foo foo1 = createFoo() // Create Foo with default values 
Foo foo2 = createFoo(age:21) // Create Foo where age param differs from defaut 
Foo foo3 = createFoo(name:'Jane', address:'Low Street 11') // You get the picture 
// + any other combination available 

Ứng dụng thực tế mà tôi đang làm việc trên sẽ có nhiều hơn nữa các thông số và do đó rất nhiều sự kết hợp cần thiết.

Cảm ơn

UPDATE:

Phương pháp nhà máy tôi đang lập kế hoạch là dành cho mục đích thử nghiệm. Không thể thực sự chạm vào lớp Foo thực tế và đặc biệt không phải là giá trị mặc định.

@dmahapatro và @codelarks trả lời dưới đây có một điểm tốt trong việc sử dụng Bản đồ làm thông số cung cấp cho tôi ý tưởng về giải pháp khả thi. Tôi có thể tạo một bản đồ với các giá trị mặc định mong muốn và ghi đè các giá trị cần thiết và chuyển nó tới phương thức nhà máy. Điều này có thể sẽ làm công việc và tôi sẽ đi với điều đó, trừ khi tôi nhận được một gợi ý của một cách tiếp cận tốt hơn.

cách tiếp cận hiện tại của tôi dưới đây

defaults = [ name:'john', age:61, address:'High Street'] 

@ToString(includeFields = true, includeNames = true) 
class Foo { 
    // Can't touch this :) 
    def name = '' 
    def age = 0 
    def address = '' 
} 

def createFoo(Map params) { 
    return new Foo(params) 
} 

println createFoo(defaults) 
println createFoo(defaults << [age:21]) 
println createFoo(defaults << [ name:'Jane', address:'Low Street']) 

LƯU Ý: leftShift hoạt động (< <) đổi các bản đồ gốc, vì vậy trong ví dụ tuổi trên sẽ được 21 trong phương pháp gọi cuối cùng là tốt. Trong trường hợp của tôi, đây không phải là vấn đề vì bản đồ mặc định có thể được tạo mới mỗi lần trong phương thức thiết lập.

+0

Không làm điều đó. 'mặc định' duy trì trạng thái trong trường hợp này. Làm cho nó địa phương. Xem cập nhật của tôi. – dmahapatro

+0

Tôi đã nhận ra rằng, do đó lưu ý trong bản cập nhật của tôi. Dù sao, bằng cách sử dụng một bản đồ địa phương chức năng cho các giá trị mặc định là một cách tiếp cận tốt hơn nhiều. Cảm ơn vì tiền hỗ trợ. – kaskelotti

Trả lời

22

Groovy thực hiện điều đó cho bạn theo mặc định (nhà xây dựng bản đồ). Bạn sẽ không cần một phương pháp nhà máy. Dưới đây là một ví dụ

import groovy.transform.ToString 

@ToString(includeFields = true, includeNames = true) 
class Foo{ 
    String name = "Default Name" 
    int age = 25 
    String address = "Default Address" 
} 

println new Foo() 
println new Foo(name: "John Doe") 
println new Foo(name: "Max Payne", age: 30) 
println new Foo(name: "John Miller", age: 40, address: "Omaha Beach") 

//Prints 
Foo(name:Default Name, age:25, address:Default Address) 
Foo(name:John Doe, age:25, address:Default Address) 
Foo(name:Max Payne, age:30, address:Default Address) 
Foo(name:John Miller, age:40, address:Omaha Beach) 

CẬP NHẬT
@ chiêm tinh codelark của :). Trong trường hợp không thể truy cập lớp học để đặt giá trị mặc định, bạn có thể làm như

@ToString(includeFields = true, includeNames = true) 
class Bar{ 
    String name 
    int age 
    String address 
} 

def createBar(Map map = [:]){ 
    def defaultMap = [name:'John Doe',age:51,address:'High Street 11'] 
    new Bar(defaultMap << map) 
} 

println createBar() 
println createBar(name: "Ethan Hunt") 
println createBar(name: "Max Payne", age: 30) 
println createBar(name: "John Miller", age: 40, address: "Omaha Beach") 


//Prints 
Bar(name:John Doe, age:51, address:High Street 11) 
Bar(name:Ethan Hunt, age:51, address:High Street 11) 
Bar(name:Max Payne, age:30, address:High Street 11) 
Bar(name:John Miller, age:40, address:Omaha Beach) 
+3

và nếu vì một lý do nào đó bạn không muốn sử dụng hàm tạo bản đồ, bạn có thể tạo hàm như trên nhưng với một tham số bản đồ duy nhất và thực hiện điều tương tự. – codelark

+1

Tôi đã cập nhật câu hỏi của mình với các chi tiết này, nhưng tôi cũng sẽ thêm chúng ở đây cho bạn. Phương pháp này là dành cho mục đích thử nghiệm, vì vậy tôi không thể chạm vào các giá trị mặc định của lớp Foo thực tế. – kaskelotti

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