나는 안드로이드 개발 스킬 세트를 키우고 강화하기 위해 처음으로 '비 튜토리얼'애플리케이션을 개발 중이다.Java Generic이 포함 된 newInstance()?
저는 제 많은 조각이 Question
클래스의 하위 클래스를 사용하여 동일한 작업을 수행하기 때문에 재사용 성과 디버깅을 향상시키기 위해 많은 Java Generics를 사용해 왔습니다.
필자는 새로운 개념의 패턴을 사용하여 Java의 일반 클래스에 적용 할 수 있는지 궁금해했습니다.
은 텍스트에 따르면, newInstance(args,...)
방법 의도 기타 에 조각 인수의 전환을 처리하는 단편 클래스 내에서 생성되어야한다.
예 :
SomeActivity.class
@Override
protected Fragment createFragment() {
return new ObjectFragment();
UUID objectId = (UUID)getIntent()
.getSerializableExtra(ObjectFragment.EXTRA_OBJECT_ID);
return ObjectFragment.newInstance(objectId);
}
ObjectFragment.class
public static ObjectFragment newInstance(UUID objectId) {
Bundle args = new Bundle();
args.putSerializable(EXTRA_CRIME_ID, objectId);
ObjectFragment fragment = new ObjectFragment();
fragment.setArguments(args);
return fragment;
}
발췌에서 : 브라이언 하디. "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
try : return QuestionListFragment. newInstance (getIntent(). getExtras()); –
maress
다음과 같은 메시지가 나타납니다.이 줄에 여러 마커가 있습니다 \t - QuestionListFragment 유형의 newInstance (Bundle) 메서드는 일반적이지 않습니다. \t \t - 토큰에 구문 오류가 발생하여이 토큰을 삭제하십시오. –
Matt
newInstance (Bundle) generic은 어떻게 만들 수 있습니까? – Matt