2016-03-22 8 views
7

W dokumentacji dla public Object get(Object obj) metody w klasie Field jest powiedziane, żeJaki jest cel prymitywnego gettera/setera w polu?

Wartość jest automatycznie zawinięte w obiekcie, czy posiada ono prymitywny typu.

i public void set(Object obj, Object value) że

Jeśli pole bazowy jest prymitywne typu rozpakowaniu konwersji próbowali przekształcić nową wartość do wartości z prymitywnego typu.

Więc mam rację, że jedynym celem tego konkretnego prymitywnego getter i setter jak getInt i setInt jest zapobieganie redundantny konwersję typu?
Od tego kod działa poprawnie

public class Test{ 
    int i = 1; 
    public static void main(String[] args) throws Exception{ 
     Test inst = new Test(); 
     Class<?> clazz = inst.getClass(); 
     Field fi = clazz.getDeclaredField("i"); 
     int ii = (int) fi.get(inst); 
     Integer iii = new Integer(ii * 2); 
     fi.set(inst, iii); 
    } 
} 

Pytam, czy ktoś wie, scenariusz, który wymaga, aby korzystać z tych metod oprócz względów wydajnościowych.

+0

O ile mogę powiedzieć, sam odpowiedziałeś na to pytanie. Odwołujesz się do dokumentacji, która zasadniczo stwierdza, że ​​prymityw zostanie zapakowany/rozpakowany, jeśli będzie to konieczne, jeśli użyjesz wersji Object metod. – aioobe

+0

Pierwotnie był to wyłącznie ze względów wydajnościowych, ale może być przypadkowa przyczyna. –

Odpowiedz

0

Dotyczy to zarówno bezpieczeństwa, jak i wydajności. Pomyśl o tym w inny sposób - metos get*() są przeznaczone do uzyskania dostępu do prymitywnych pól, a dzięki get() po prostu działa, ale wymaga boksowania/rozpakowywania.

Innymi słowy, jedynym powodem używania get() na prymitywnym polu jest, jeśli nie znasz jego typu z wyprzedzeniem.