2017-11-01 76 views
8

Mam scenariusz, w którym dwie funkcje są identycznie podobny ale obiekt klasy stosuje się w dwóch różniących się, podobnie jak to,Korzystanie ogólny typ dla samej funkcjonalności

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

i podobnie innej funkcji jak,

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

Jak mogę użyć klasy ogólnej dla obiektu nadrzędnego w powyższym obiekcie? Nie stosowałem jeszcze leków generycznych.

+1

Nie koniecznie rodzajowych tutaj. Nie możesz zdefiniować podstawowego interfejsu/klasy, który definiuje jakąś "ogólną" właściwość? W najgorszym przypadku można po prostu użyć obiektu tutaj. – GhostCat

+0

Dziękujemy @GhostCat. Czy mógłbyś pokazać Jak zdefiniować ogólną właściwość powyżej LeadMaster i DealMaster, przykład – AJN

Odpowiedz

6

Jeśli chcesz swoją metodę pracy z jakiejkolwiek własności klasy inputObject, można przekazać funkcjonalny interfejs, który zwraca żądaną własność dana inputObject instancja:

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

teraz można wywołać tę metodę z

function(input,inputObject::getLeadMaster); 

lub

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

o cholera - absolutnie tak :) – Eugene

+0

Dziękuję @Eran. Szukałem tego samego. – AJN

+0

Co byłoby interesujące, byłoby zobaczyć, jak metoda 'PropertyUtils.setProperty' działałaby, gdyby' LeadMaster' i 'DealMaster' nie miały wspólnego interfejsu. – CKing

0

Można by ponownie zdefiniować metody po prostu jako:

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

Dziękuję @Eugene. Ale mam wiele takich obiektów master w mojej aplikacji. Więc myślałem o bardziej ogólnym rozwiązaniu. Dziękuję za Twoją odpowiedź. – AJN

0

Pierwsza zmiana inputObject. Metody zapisu input.getMaster (Obiekt obiektu) input.setMaster (Obiekt obiektu), który ustawia i otrzymuje ogólne obiekty. Będziesz mógł ustawić zarówno ogólne, jak i LeadMaster i DealMaster.

Napisz klasę abstrakcyjną lub użyj klasy super rozszerzonej do obu klas, która ma function1 i function2. wewnątrz tej abstrakcyjnej lub super użyć klasy metoda rodzajowa zdefiniowano w inputObject

public int function(inputObject input){ 
    PropertyUtils.setProperty(input.getMaster, input.getKey(), input.getValue()); 
    return 0; 
}