programing

조각 만들기 : 생성자 대 newInstance ()

copyandpastes 2021. 1. 15. 20:16
반응형

조각 만들기 : 생성자 대 newInstance ()


저는 최근에 .NET Framework를 만들 때 String인수를 전달할 키를 지속적으로 알아야하는 것에 지쳤습니다 . 그래서 난에 대한 생성자를하기로 결정 내 나는 세트에 원하는 매개 변수를 사용하고,에 그 변수를 넣어 것입니다 올바른에 따라서 다른에 대한 필요성을 제거, 키 그 키를 알 필요.BundlesFragmentsFragmentsBundlesStringFragmentsActivities

public ImageRotatorFragment() {
    super();
    Log.v(TAG, "ImageRotatorFragment()");
}

public ImageRotatorFragment(int imageResourceId) {
    Log.v(TAG, "ImageRotatorFragment(int imageResourceId)");

    // Get arguments passed in, if any
    Bundle args = getArguments();
    if (args == null) {
        args = new Bundle();
    }
    // Add parameters to the argument bundle
    args.putInt(KEY_ARG_IMAGE_RES_ID, imageResourceId);
    setArguments(args);
}

그런 다음 평소처럼 그 주장을 뽑습니다.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.v(TAG, "onCreate");

    // Set incoming parameters
    Bundle args = getArguments();
    if (args != null) {
        mImageResourceId = args.getInt(KEY_ARG_IMAGE_RES_ID, StaticData.getImageIds()[0]);
    }
    else {
        // Default image resource to the first image
        mImageResourceId = StaticData.getImageIds()[0];
    }
}

그러나 Lint는이 문제를 해결하여 Fragment다른 매개 변수 있는 생성자의 하위 클래스가 없어서 @SuppressLint("ValidFragment")앱을 실행하는 데에도 사용해야 했습니다. 문제는이 코드가 완벽하게 작동한다는 것입니다. ImageRotatorFragment(int imageResourceId)또는 구식 방법을 사용 ImageRotatorFragment()하고 setArguments()수동으로 호출 할 수 있습니다 . Android가 Fragment (방향 변경 또는 메모리 부족)를 다시 만들어야하는 경우 ImageRotatorFragment()생성자를 호출 한 다음 Bundle내 값과 함께 동일한 인수를 전달하여 올바르게 설정됩니다.

그래서 저는 "제안 된"접근 방식을 찾고 있었고 매개 변수를 사용 newInstance()하여 생성하는 데 사용하는 많은 예제를 보았습니다. Fragments이는 제 생성자와 동일한 작업을 수행하는 것 같습니다. 그래서 나는 그것을 테스트하기 위해 내 자신을 만들었고, Lint가 그것에 대해 징징 대는 것을 빼고 이전과 마찬가지로 완벽하게 작동합니다.

public static ImageRotatorFragment newInstance(int imageResourceId) {
    Log.v(TAG, "newInstance(int imageResourceId)");

    ImageRotatorFragment imageRotatorFragment = new ImageRotatorFragment();

    // Get arguments passed in, if any
    Bundle args = imageRotatorFragment.getArguments();
    if (args == null) {
        args = new Bundle();
    }
    // Add parameters to the argument bundle
    args.putInt(KEY_ARG_IMAGE_RES_ID, imageResourceId);
    imageRotatorFragment.setArguments(args);

    return imageRotatorFragment;
}

I personally find that using constructors is a much more common practice than knowing to use newInstance() and passing parameters. I believe you can use this same constructor technique with Activities and Lint will not complain about it. So basically my question is, why does Google not want you to use constructors with parameters for Fragments?

My only guess is so you don't try to set an instance variable without using the Bundle, which won't get set when the Fragment gets recreated. By using a static newInstance() method, the compiler won't let you access an instance variable.

public ImageRotatorFragment(int imageResourceId) {
    Log.v(TAG, "ImageRotatorFragment(int imageResourceId)");

    mImageResourceId = imageResourceId;
}

I still don't feel like this is enough reason to disallow the use of parameters in constructors. Anyone else have insight into this?


I personally find that using constructors is a much more common practice than knowing to use newInstance() and passing parameters.

The factory method pattern is used fairly frequently in modern software development.

So basically my question is, why does Google not want you to use constructors with parameters for Fragments?

You answered your own question:

My only guess is so you don't try to set an instance variable without using the Bundle, which won't get set when the Fragment gets recreated.

Correct.

I still don't feel like this is enough reason to disallow the use of parameters in constructors.

You are welcome to your opinion. You are welcome to disable this Lint check, either on a per-constructor or per-workspace fashion.


Android only recreates fragments it kills using default constructor, so any initialization we do in additional constructors will be lost.Hence data will be lost.

ReferenceURL : https://stackoverflow.com/questions/14654766/creating-a-fragment-constructor-vs-newinstance

반응형