Generify Refactoring 

 

ÀÌ ¼½¼ÇÀº ´ç½Å¿¡°Ô Generify  ¸®ÆÑÅ丵 ±â´É¿¡ ´ëÇØ Æ÷°ýÀûÀΠoverview ¿Í  how ÀÌ ¸®ÆÑÅ丵ÀÌ IntelliJ IDEA¿¡¼­ »ç¿ëµÉ ¼ö Àִ°¡¸¦ Á¦°øÇÕ´Ï´Ù.

°³¿ä


Generify ¸®ÆÑÅ丵Àº Generics-aware °ÍÀ¸·Î Generics¸¦ »ç¿ëÇÏÁö ¾Ê´Â ±âÁ¸ Äڵ带 ½±°Ô º¯Çü½Ã۱â À§ÇØ µðÀÚÀε˴ϴÙ.  ¸®ÆÑÅ丵Àº ±âÁ¸ Äڵ带 ºÐ¼®Çϰí, °¢ raw ŸÀÔÀ» À§ÇØ ¾ÈÀüÇϰí ÀϰüµÈ ¸Å°³ º¯¼ö ÇüŸ¦ Ãß·ÐÇÕ´Ï´Ù.
IDEA´Â ÀÚ¹Ù °üÁ¡À¸·ÎºÎÅÍ °¡´ÉÇÑ ÇÑ Á¤È®ÇÑ Äڵ带 »ý¼ºÇÏ·Á°í ³ë·ÂÇÕ´Ï´Ù.  ¹Ù²Ù¾î ¸»Çϸé, °¢ ¹®¸ÆÀº ÀϺΠŸÀÔ Á¦ÇÑÀ» »ý¼ºÇÏ°í ¸®ÆÑÅ丵Àº ¸ðµç ±âÁ¸ÀÇ ¹®¸Æ°ú ÇÔ²² ¸ð¼øµÇÁö ¾Ê´Â °¡Àå °¡´ÉÇÑ Å¸ÀÔÀ» »ý¼ºÇÕ´Ï´Ù. ¾Æ·¡ÀÇ  Code Sample À» º¸½Ê½Ã¿À.

Using Generify Refactoring  


Generify ¸®ÆÑÅ丵À» ½ÃÀÛÇϱâ À§ÇØ, ù ¹øÂ°·Î ÄÚµå º¯È¯ ¼öÁØ, Áï Ŭ·¡½º/ÆÐŰÁö/Æú´õ/ÇÁ·ÎÁ§Æ®¸¦ ¼±ÅÃÇϽʽÿÀ.



±×¸®°í ¸ÞÀÎ ¸Þ´º¿¡¼­ Refactor Generify  Ç׸ñÀ» ¼±ÅÃÇϽʽÿÀ.


Generify ´ÙÀ̾ó·Î±×´Â ´ç½ÅÀÌ º¯°æÀ» »ý¼ºÇÒ ¼ö ÀÖ´Â °÷¿¡ ³ªÅ¸³³´Ï´Ù.

Drop obsolete  casts  

¸¸ÀÏ ¼±ÅõǸé, ¸¸ÀÏ ±×µéÀÌ ¸®ÆÑÅ丵¿¡ ÀÇÇØ º¯°æµÇ¸é ¸Å°³ º¯¼ö ij½ºÆ® °æ¿ì°¡ ºÐ¼®µË´Ï´Ù.  ±×¸®°í ¸¸ÀÏ °á°úÀûÀÎ ¸Å°³ º¯¼ö ŸÀÔÀÌ ¸Å°³ º¯¼ö°¡ ij½ºÆÃµÇ¾ú´ø °Í°ú À¯»çÇϸé, ij½ºÆÃµÈ ½ºÅ×ÀÌÆ®¸ÕÆ®´Â Á¦°ÅµË´Ï´Ù.

Preserve raw  arrays  

¸¸ÀÏ ¼±ÅõǸé, IDEA¿Í ÇÔ²² ÇöÀç ¼±ÀûµÈ Generics ¹öÀüÀÌ ÀÌ Æ¯Â¡À» Áö¿øÇÏÁö ¾Ê´Â µ¿¾È ¹è¿­Àº parameterizedµÈ ŸÀÔ°ú ÇÔ²² º¯°æµÇÁö ¾Ê½À´Ï´Ù.  ¼±ÅõÇÁö ¾ÊÀ¸¸é ¹è¿­Àº º¯ÇüµÉ °ÍÀÔ´Ï´Ù. ±×·¯³ª ´ç½ÅÀÌ ±âÁ¸ ÄÄÆÄÀÏ·¯¸¦ »ç¿ëÇÑ´Ù¸é ´ç½ÅÀº ÃÖÁ¾ÀûÀ¸·Î ÄÄÆÄÀÏ µÇÁö ¾Ê´Â Äڵ带 °®°Ô µÉ À§ÇèÀ» ¾Ë°í ÀÖ¾î¾ß¸¸ ÇÕ´Ï´Ù .

Leave Object-parameterized  types raw  

¸¸ÀÏ ¼±ÅõǸé Generics º¯È¯ ÀÌÈÄ¿¡ ±×°Íµé Áß¿¡ Çϳª°¡ ObjectÀÎ °÷¿¡ ¸Å°³ º¯¼ö¿Í ÇÔ²² ¸ðµç Ŭ·¡½º´Â raw°¡ µÉ °Í ÀÔ´Ï´Ù.

Preview usages  to be generified  

üũ ¹Ú½º¸¦ ¼±ÅÃÇÏ¸é ´ç½Å¿¡°Ô ¾î¶² »ç¿ëÀÌ ¹ß°ßµÇ¾ú´ÂÁö °è¼Ó ±â¾ïÇϰí ÀÖ°í, ±×µéÀÇ ±³Ã¼¸¦ ½ÂÀÎÇϵµ·Ï Çã¶ôÇÕ´Ï´Ù. ÀÌ Ã¼Å© ¹Ú½º°¡ ¼±ÅõÇÁö ¾ÊÀ» ¶§, IDEA´Â ±³Ã¼¸¦ ÀÚµ¿ÀûÀ¸·Î ¼öÇàÇÕ´Ï´Ù.


½ÉÁö¾î üũ ¹Ú½º°¡ È®ÀεÇÁö ¾Ê¾ÒÀ» ¶§µµ, ¸¸ÀÏ ¹ß°ßµÈ »ç¿ëÀÌ ¾î¶² Àбâ Àü¿ë ÆÄÀÏ¿¡¼­ Á¸ÀçÇÏ¸é ´ç½Å¿¡°Ô »ç¿ë ±³Ã¼¸¦ È®ÀÎÇϱâ À§ÇØ ÇÁ·ÒÇÁÆ® µÉ °Í ÀÔ´Ï´Ù.


Refactoring Preview ´ÙÀ̾ó·Î±×¿¡¼­ (¸¸ÀÏ ±×°ÍÀÌ ³ªÅ¸³ª¸é) ´ç½ÅÀº ¼öÇàµÈ º¯°æÀ» ºÐ¼®ÇÒ ¼ö ÀÖ½À´Ï´Ù.  ¸®ÆÑÅ丵°ú ÇÔ²² ÁøÇàÇϱâ À§Çؼ­, Do Refactor¸¦ Ŭ¸¯ÇÕ´Ï´Ù±×·¸Áö ¾Ê´Ù¸é Cancel À» Ŭ¸¯ÇÕ´Ï´Ù. »ó¼¼ÇÑ °ÍÀ» º¸·Á¸é Refactoring Preview¸¦ º¸½Ê½Ã¿À.


ÄÚµå º¯È¯À» ½ÃÀÛÇϱâ À§ÇÏ¿© Do Refactor¸¦ ´©¸£½Ê½Ã¿À.

Code Sample  

 

 
import java.util.List;
import java.util.LinkedList;
 
public class GenerifySamples {
        void generifyDeclaration() {
        List list = new LinkedList();
 
        list.add("");
    }
 
    List generifyMethodReturnType() {
        List list = new LinkedList();
 
        list.add((String) generifyMethodReturnType().get(0));
 
        return list;
    }
 
    void generifyMethodParameter(List list) {
        list.add("");
    }
 
    void covariantGenerify() {
        class Parent {
        }
        class Child extends Parent {
        }
 
        List listOfParent = new LinkedList();
 
        listOfParent.add(new Parent());
        listOfParent.add(new Child());
    }
 
    void invariantGenerify() {
        class Parent {
        }
        class Child extends Parent {
        }
 
        List listOfParent = new LinkedList();
        List listOfChild = new LinkedList();
        List rawList = new LinkedList();
 
        listOfParent.add(new Parent());
        listOfChild.add(new Child());
 
        rawList.add(listOfParent);
        rawList.add(listOfChild);
    }
 
    void safeGenerify(RawContext context) {
        List list = new LinkedList();
 
        list.add("");
 
        list = context.restrictor();
    }
 
    class Parent {
    }
 
    class Child <X> extends Parent {
        void put(X x) {
        }
    }
 
    Parent killingCast() {
        Child child = new Child();
 
        child.put("");
 
        return child;
    }
}

 

 
import java.util.List;
import java.util.LinkedList;
 
public class GenerifySamples {
        void generifyDeclaration() {
        List<String> list = new LinkedList<String>();
 
        list.add("");
    }
 
    List<String> generifyMethodReturnType() {
        List<String> list = new LinkedList<String>();
 
        list.add(generifyMethodReturnType().get(0));
 
        return list;
    }
 
    void generifyMethodParameter(List<String> list) {
        list.add("");
    }
 
    void covariantGenerify() {
        class Parent {
        }
        class Child extends Parent {
        }
 
        List<Parent> listOfParent = new LinkedList<Parent>();
 
        listOfParent.add(new Parent());
        listOfParent.add(new Child());
    }
 
    void invariantGenerify() {
        class Parent {
        }
        class Child extends Parent {
        }
 
        List<Parent> listOfParent = new LinkedList<Parent>();
        List<Parent> listOfChild = new LinkedList<Parent>();
        List<List<Parent>> rawList = new LinkedList<List<Parent>>();
 
        listOfParent.add(new Parent());
        listOfChild.add(new Child());
 
        rawList.add(listOfParent);
        rawList.add(listOfChild);
    }
 
    void safeGenerify(RawContext context) {
        List list = new LinkedList();
 
        list.add("");
 
        list = context.restrictor();
    }
 
    class Parent {
    }
 
    class Child <X> extends Parent {
        void put(X x) {
        }
    }
 
    Parent killingCast() {
        Child child = new Child();
 
        child.put("");
 
        return child;
    }
}