2014-06-24 3 views
4

나는 안드로이드 개발 스킬 세트를 키우고 강화하기 위해 처음으로 '비 튜토리얼'애플리케이션을 개발 중이다.Java Generic이 포함 된 newInstance()?

저는 제 많은 조각이 Question 클래스의 하위 클래스를 사용하여 동일한 작업을 수행하기 때문에 재사용 성과 디버깅을 향상시키기 위해 많은 Java Generics를 사용해 왔습니다.

필자는 새로운 개념의 패턴을 사용하여 Java의 일반 클래스에 적용 할 수 있는지 궁금해했습니다.

은 텍스트에 따르면, newInstance(args,...) 방법 의도 기타 에 조각 인수의 전환을 처리하는 단편 클래스 내에서 생성되어야한다.

예 :

SomeActivity.class

@​O​v​e​r​r​i​d​e​ 
p​r​o​t​e​c​t​e​d​ ​F​r​a​g​m​e​n​t​ ​c​r​e​a​t​e​F​r​a​g​m​e​n​t​(​)​ ​{​ 
​ ​ ​ ​r​e​t​u​r​n​ ​n​e​w​ ​ObjectF​r​a​g​m​e​n​t​(​)​;​ 

​ ​ ​ ​U​U​I​D​ ​object​I​d​ ​=​ ​(​U​U​I​D​)​g​e​t​I​n​t​e​n​t​(​)​ 
​ ​ ​ ​ ​ ​ ​ ​.​g​e​t​S​e​r​i​a​l​i​z​a​b​l​e​E​x​t​r​a​(Object​F​r​a​g​m​e​n​t​.​E​X​T​R​A​_​OBJECT_​I​D​)​;​ 

​ ​ ​ ​r​e​t​u​r​n​ ​Object​F​r​a​g​m​e​n​t​.​n​e​w​I​n​s​t​a​n​c​e​(object​I​d​)​;​ 
}​ 

ObjectFragment.class

p​u​b​l​i​c​ ​s​t​a​t​i​c​ ObjectF​r​a​g​m​e​n​t​ ​n​e​w​I​n​s​t​a​n​c​e​(​U​U​I​D​ ​object​I​d​)​ ​{​ 
​ ​ ​ ​B​u​n​d​l​e​ ​a​r​g​s​ ​=​ ​n​e​w​ ​B​u​n​d​l​e​(​)​;​ 
​ ​ ​ ​a​r​g​s​.​p​u​t​S​e​r​i​a​l​i​z​a​b​l​e​(​E​X​T​R​A​_​C​R​I​M​E​_​I​D​,​ ​object​I​d​)​;​ 

​ ​ ​ ​ObjectF​r​a​g​m​e​n​t​ ​f​r​a​g​m​e​n​t​ ​=​ ​n​e​w​ ​ObjectF​r​a​g​m​e​n​t​(​)​;​ 
​ ​ ​ ​f​r​a​g​m​e​n​t​.​s​e​t​A​r​g​u​m​e​n​t​s​(​a​r​g​s​)​;​ 

​ ​ ​ ​r​e​t​u​r​n​ ​f​r​a​g​m​e​n​t​;​ 
}​ 

발췌에서 : 브라이언 하디. "Android 프로그래밍 : The Big Nerd Ranch Guide"

Java Generics를 사용하는 경우는 어떻습니까? 내가 일하고

코드 :

QuestionListActivity.class 현재

public class QuestionListActivity extends SingleFragmentActivity { 


    // CONSTANTS 
    public static final String EXTRA_FRAGMENT_TYPE = "com.renaissanceartsmedia.flashcard.editquestionactivity.fragment"; 
    public static final String EXTRA_ACTIVITY_TITLE = "ListQuestionActivity.EXTRA_ACTIVITY_TITLE"; 
    public static final String TAG = "QuestionListActivity"; 

    // Member Properties 
    QuestionType mFragmentType; 

    @Override 
    protected Fragment createFragment() { 

     mFragmentType = (QuestionType) getIntent().getSerializableExtra(EXTRA_FRAGMENT_TYPE); 
     System.out.println("mFragmentType: " + mFragmentType); 

     // Switch on Enumeration 
     switch (mFragmentType) { 

      case MULTIPLE_ANSWER_QUESTION: 
      case MULTIPLE_CHOICE_QUESTION: 
      case TRUE_FALSE_QUESTION: 

       // PREVIOUS METHOD 
       //return new QuestionListFragment<MultipleAnswerQuestion>(); 

       // Attempting to refactor to newInstance(Bundle args) 
       return QuestionListFragment<MultipleAnswerQuestion>.newInstance(getIntent().getExtras()); // ERROR 

      case MATCHING_QUESTION: 
       return new QuestionListFragment<MatchingQuestion>(); 

      case BLANK_QUESTION: 
       //return new BQFragment(); 
       return new QuestionListFragment<BlankQuestion>(); 
      default: 
       return new QuestionListFragment<Question>(); 
     } 

    } 
} 

, 나는 QuestionListFragment의에서 onCreate() 메소드 내에서 엑스트라를 얻고있다. Java Generics에서 newInstance() 규칙으로 전환해야하는 경우이 코드를 제거하겠다는 것을 알고 있습니다.

QuestionListFragment.class

public class QuestionListFragment<E extends Question> extends ListFragment implements QuestionDialogInterface { 

     // Constants 
     public static final String TAG = "QuestionListFragement"; 
     public static final String DIALOG_TITLE = "QuestionListFragment.DIALOG_TITLE"; 
     public static final String DIALOG_MESSAGE = "QuestionListFragment.DIALOG_MESSAGE"; 
     public static final String QUESTION_TYPE = "QUESTION_TYPE"; 
     private static final int DIALOG_FRAGMENT = 1; 

     // Member Properties 
     Flashcard mFlashcard; 
     QuestionType mQuestionType; 
     String mActivityTitle; 
     ArrayList<E> mQuestions; 
     DialogFragment mDialogFragment; 

// SOMETHING LIKE THIS??? 
     @SuppressWarnings({ "unchecked", "rawtypes" }) 
     public static QuestionListFragment<? extends Question> newInstance(Bundle args) { 
      // Create a new instance of QuestionListFragment<? extends Question> 
      QuestionListFragment<? extends Question> fragment = new QuestionListFragment(); 

      // Set the arguments 
      fragment.setArguments(args); 

      // Return the Fragment 
      return fragment; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      Log.d(TAG,"Enter onCreate(Bundle savedInstanceState)"); 
      // Enable Options Menu 
      setHasOptionsMenu(true); 

      // Create the ActionBar 'UP' Button 
      getActivity().getActionBar().setDisplayHomeAsUpEnabled(true); 

      // The Intent Extras 
      Bundle extras = getActivity().getIntent().getExtras(); 

      // Extract the Flashcard from the extras 
      UUID flashcardId = (UUID) extras.getSerializable(Flashcard.EXTRA_FLASHCARD_ID); 
      mFlashcard = FlashcardStore.get(getActivity()).getFlashcard(flashcardId); 
      mQuestionType = (QuestionType) extras.getSerializable(EditQuestionActivity.EXTRA_FRAGMENT_TYPE); 
      mActivityTitle = extras.getString(QuestionListActivity.EXTRA_ACTIVITY_TITLE); 


      // Get a Container of Multiple Answer Questions 
      mQuestions = (ArrayList<E>) mFlashcard.getQuestions(mQuestionType); 

      // Set the Title of the Fragment's Activity 
      getActivity().setTitle(mActivityTitle); 

      // Create a list 
      ListItemLayoutAdapter adapter = new ListItemLayoutAdapter(mQuestions); 

      // Set the adapter for the list 
      setListAdapter(adapter); 
      Log.d(TAG,"Exit onCreate(Bundle savedInstanceState)"); 
     } 
    .... 
    } 

모범 사례 안드로이드 파편 자바 제네릭에 관해서 무엇인가? 누군가가 자신이 무엇인지, 왜 사용해야하는지 설명 할 수 있습니까?

// Attempting to refactor to newInstance(Bundle args) 
return QuestionListFragment<MultipleAnswerQuestion>.newInstance(getIntent().getExtras()); // ERROR 
+0

try : return QuestionListFragment. newInstance (getIntent(). getExtras()); – maress

+0

다음과 같은 메시지가 나타납니다.이 줄에 여러 마커가 있습니다 \t - QuestionListFragment 유형의 newInstance (Bundle) 메서드는 일반적이지 않습니다. \t \t - 토큰에 구문 오류가 발생하여이 토큰을 삭제하십시오. – Matt

+0

newInstance (Bundle) generic은 어떻게 만들 수 있습니까? – Matt

답변

6
public static <T extends Question> QuestionListFragment<T> newInstance(Bundle args) { 
     // Create a new instance of QuestionListFragment<? extends Question> 
     QuestionListFragment<T> fragment = new QuestionListFragment<T>(); 

     // Set the arguments 
     fragment.setArguments(args); 

     // Return the Fragment 
     return fragment; 
    } 

를 한 다음 전화 : 위해서, newInstance()를 사용해야하는 경우, 선언에 대한 올바른 구문을 제공하여 나에게 오류를 수정 도와주세요

QuestionListFragment.<MultipleAnswerQuestion>newInstance(getIntent().getExtras()‌​); 
+0

오류로 인해 약간 변경되는 경우 : public static QuestionListFragment newInstance (번들 args) -이 작동하지만 토큰에 대한 구문 오류가 발생합니다. QuestionListActivity.class에서 토큰의 Eclipse 오류가 발생합니다. – Matt

+0

오류를 해결했습니다. 이제 작동해야합니다 – maress

+0

편집 내용이 QuestionListFragment.class에서 작동하지만 토큰에 '구문 오류가 있습니다.이 토큰을 삭제하십시오'라는 질문에 QuestionListActivity.class의 Eclipse 오류가 표시되어 더 많은 정보를 제공하고 싶습니다. 어떤 토큰 – Matt

0
public static <T extends BaseFragment> T getInstance (Class<T> mClass, Bundle args) { 
    try { 
     T instance = mClass.newInstance(); 
     instance.setArguments(args); 
     return instance; 
    } catch (java.lang.InstantiationException | IllegalAccessException e) { 
     /** 
     * Error thrown 
     */ 
    } 

    return null; 
} 

더 짧은 번역. 건배

관련 문제