2017-11-01 30 views
8

Tôi gặp một kịch bản mà hai chức năng là giống nhau tương tự nhưng đối tượng Class được sử dụng trong hai khác nhau, tương tự như thế này,Sử dụng Generic Loại cho cùng một chức năng

public int function1(inputObject input){ 
    LeadMaster lead= input.getLeadMaster(); 
    PropertyUtils.setProperty(lead, input.getKey(), input.getValue()); 
    return 0; 
} 

Và chức năng khác tương tự như thế,

public int function2(inputObject input){ 
    DealMaster deal= input.getDealMaster(); 
    PropertyUtils.setProperty(deal, input.getKey(), input.getValue()); 
    return 0; 
} 

Làm cách nào để sử dụng lớp chung cho đối tượng chính trong đối tượng trên? Tôi chưa sử dụng Generics.

+1

Bạn không nhất thiết cần Generics đây. Bạn không thể định nghĩa một số giao diện/lớp cơ sở định nghĩa một số thuộc tính "chung chung"? Trường hợp xấu nhất bạn có thể chỉ đơn giản là sử dụng Object ở đây. – GhostCat

+0

Cảm ơn bạn @GhostCat. Bạn có thể vui lòng hiển thị Làm cách nào để xác định thuộc tính chung cho LeadMaster và DealMaster ở trên, ví dụ – AJN

Trả lời

6

Nếu bạn muốn phương pháp của bạn để làm việc với bất cứ tài sản của lớp inputObject, bạn có thể vượt qua một giao diện chức năng trả về giá trị tài sản của một định cần thiết inputObject dụ:

public <T> int function(inputObject input, Function<inputObject,T> func) { 
    T obj = func.apply(input); 
    PropertyUtils.setProperty(obj, input.getKey(), input.getValue()); 
    return 0; 
} 

Bây giờ bạn có thể gọi phương pháp này với

function(input,inputObject::getLeadMaster); 

hoặc

function(input,inputObject::getDealMaster); 
+0

oh damn - hoàn toàn có :) – Eugene

+0

Cảm ơn bạn @Eran. Tôi đã tìm kiếm cùng một chỉ. – AJN

+0

Điều thú vị sẽ thấy là phương thức 'PropertyUtils.setProperty' sẽ hoạt động như thế nào nếu' LeadMaster' và 'DealMaster' không chia sẻ một giao diện chung. – CKing

0

Bạn có thể tái xác định phương pháp của bạn chỉ đơn giản như:

public int function1(inputObject input, boolean lead){ 
    if(lead) { 
     LeadMaster lead= input.getLeadMaster(); 
     PropertyUtils.setProperty(lead, input.getKey(), input.getValue());  
    } else { 
     DealMaster deal= input.getDealMaster(); 
     PropertyUtils.setProperty(deal, input.getKey(), input.getValue()); 
    } 
    return 0; 
} 
+0

Cảm ơn bạn @Eugene. Nhưng tôi có nhiều đối tượng chính như vậy trong ứng dụng của tôi. Vì vậy, tôi đã nghĩ đến một giải pháp tổng quát hơn. Cảm ơn bạn đã trả lời. – AJN

0

sự thay đổi đầu tiên inputObject. Viết các phương thức input.getMaster (đối tượng đối tượng) input.setMaster (đối tượng đối tượng) để đặt và nhận các đối tượng chung. Bạn sẽ có thể đặt LeadMasterDealMaster cả về tổng thể.

Viết một lớp trừu tượng hoặc sử dụng một lớp siêu mở rộng cho cả hai lớp có function1function2. bên trong đó sử dụng phương pháp lớp học chung trừu tượng hoặc siêu bạn quy định tại inputObject

public int function(inputObject input){ 
    PropertyUtils.setProperty(input.getMaster, input.getKey(), input.getValue()); 
    return 0; 
} 
Các vấn đề liên quan