Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实例变量的使用与作为参数传递数据_Java_Android_Performance_Coding Style - Fatal编程技术网

Java 实例变量的使用与作为参数传递数据

Java 实例变量的使用与作为参数传递数据,java,android,performance,coding-style,Java,Android,Performance,Coding Style,当使用实例变量而不是将数据作为参数传递时,有哪些缺点 使用实例变量对我来说似乎更容易理解,但使它们对整个类都可用存在缺点。我想这是从全局变量和局部变量的角度来看的 使用实例变量 public class ChoicesFragment extends Fragment implements View.OnClickListener { private CharSequence[] mButtonTextData; private String mTitleTextData;

当使用实例变量而不是将数据作为参数传递时,有哪些缺点

使用实例变量对我来说似乎更容易理解,但使它们对整个类都可用存在缺点。我想这是从全局变量和局部变量的角度来看的

使用实例变量

public class ChoicesFragment extends Fragment implements View.OnClickListener {
    private CharSequence[] mButtonTextData;
    private String mTitleTextData;  
    
    private View mUserChoiceView;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        mUserChoiceView = inflater.inflate(R.layout.available_choices, container, false);

        getBundleData();

        setTitle();
        setButtons();        

        return  mUserChoiceView;
    }
    
    private void getBundleData() {
        //populate button text
        Bundle bundleData = getArguments();
        mTitleTextData = bundleData.getString(CardFragment.TITLE_TEXT_KEY);
        mButtonTextData = bundleData.getCharSequenceArray(CardFragment.BUTTON_TEXT_KEY);        
    }
    
    private void setTitle() {
        TextView title = (TextView) mUserChoiceView.findViewById(R.id.choicesTextView1);
        String genericTitle = getResources().getString(R.string.title_selection);
        title.setText(genericTitle + mTitleTextData);
    }

    //sets up button data
    public void setButtons() {
        TextView[] buttonsTextView = new TextView[4];
        buttonsTextView[0] = (TextView) mUserChoiceView.findViewById(R.id.choicesTextView2);
        buttonsTextView[1] = (TextView) mUserChoiceView.findViewById(R.id.choicesTextView3);
        buttonsTextView[2] = (TextView) mUserChoiceView.findViewById(R.id.choicesTextView4);
        buttonsTextView[3] = (TextView) mUserChoiceView.findViewById(R.id.choicesTextView5);

        for(int i = 0; i < buttons.length; i++) {
            buttonsTextView[i].setText(mButtonTextData[i]);
        }
    }   
}
公共类ChoicesFragment扩展片段实现View.OnClickListener{
私有字符序列[]mbuttonextdata;
私有字符串mTitleTextData;
私家观点博物馆观点;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
mUserChoiceView=充气机。充气(R.layout.available\u选项,容器,false);
getBundleData();
setTitle();
挫折();
返回mUserChoiceView;
}
私有void getBundleData(){
//填充按钮文本
Bundle bundleData=getArguments();
mTitleTextData=bundleData.getString(CardFragment.TITLE\u TEXT\u KEY);
mbuttonextdata=bundleData.getCharSequenceArray(CardFragment.BUTTON\u TEXT\u KEY);
}
私有void setTitle(){
TextView title=(TextView)mUserChoiceView.findViewById(R.id.choicesTextView1);
String genericTitle=getResources().getString(R.String.title\u选择);
title.setText(genericTitle+mTitleTextData);
}
//设置按钮数据
公共无效设置按钮(){
TextView[]按钮TextView=新建TextView[4];
buttonsTextView[0]=(TextView)mUserChoiceView.findViewById(R.id.ChoicesTextView 2);
buttonsTextView[1]=(TextView)mUserChoiceView.findViewById(R.id.ChoicesTextView 3);
按钮文本视图[2]=(文本视图)mUserChoiceView.findViewById(R.id.choicesTextView4);
buttonsTextView[3]=(TextView)mUserChoiceView.findViewById(R.id.ChoicesTextView 5);
对于(int i=0;i
第二个示例将数据作为参数传递

public class ChoicesFragment extends Fragment implements View.OnClickListener { 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {                            
        View userChoiceView;
                             
        String titleTextData;
        CharSequence[] buttonTextData;
        
        mUserChoiceView = inflater.inflate(R.layout.available_choices, container, false);

        Bundle bundleData = getArguments();
        buttonTextData = bundleData.getString(CardFragment.TITLE_TEXT_KEY);
        titleTextData = bundleData.getCharSequenceArray(CardFragment.BUTTON_TEXT_KEY);

        setTitle(userChoiceView, titleTextData);
        setButtons(userChoiceView, buttonTextData);        

        return  mUserChoiceView;
    }
    
    private void setTitle(View userChoiceView, String titleText) {
        TextView title = (TextView) userChoiceView.findViewById(R.id.choicesTextView1);
        String genericTitle = getResources().getString(R.string.title_selection);
        title.setText(genericTitle + titleText);
    }

    //sets up button data
    public void setButtons(View userChoiceView, CharSequence[] buttonText) {
        TextView[] buttonsTextView = new TextView[4];
        buttonsTextView[0] = (TextView) userChoiceView.findViewById(R.id.choicesTextView2);
        buttonsTextView[1] = (TextView) userChoiceView.findViewById(R.id.choicesTextView3);
        buttonsTextView[2] = (TextView) userChoiceView.findViewById(R.id.choicesTextView4);
        buttonsTextView[3] = (TextView) userChoiceView.findViewById(R.id.choicesTextView5);

        for(int i = 0; i < buttons.length; i++) {
            buttonsTextView[i].setText(buttonText[i]);
        }
    }   
}
公共类ChoicesFragment扩展片段实现View.OnClickListener{
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图用户选择视图;
字符串titleTextData;
CharSequence[]ButtonExtData;
mUserChoiceView=充气机。充气(R.layout.available\u选项,容器,false);
Bundle bundleData=getArguments();
buttonTextData=bundleData.getString(CardFragment.TITLE\u TEXT\u KEY);
titleTextData=bundleData.getCharSequenceArray(CardFragment.BUTTON\u TEXT\u键);
setTitle(userChoiceView,titleTextData);
设置按钮(userChoiceView、ButtonExtData);
返回mUserChoiceView;
}
私有void setTitle(查看用户选择视图,字符串titleText){
TextView title=(TextView)userChoiceView.findViewById(R.id.choicesTextView1);
String genericTitle=getResources().getString(R.String.title\u选择);
title.setText(genericTitle+titleText);
}
//设置按钮数据
公共无效设置按钮(视图用户选择视图,字符序列[]按钮文本){
TextView[]按钮TextView=新建TextView[4];
buttonsTextView[0]=(TextView)userChoiceView.findViewById(R.id.choicesTextView2);
buttonsTextView[1]=(TextView)userChoiceView.findViewById(R.id.choicesTextView3);
buttonsTextView[2]=(TextView)userChoiceView.findViewById(R.id.choicesTextView4);
buttonsTextView[3]=(TextView)userChoiceView.findViewById(R.id.choicesTextView5);
对于(int i=0;i
使用参数可以使方法自包含。您永远不必怀疑实例变量的值,因为您将数据作为参数传递


除了封装的非常有用的好处外,参数化方法比依赖于实例变量值的方法更容易进行单元测试。

在它们自己的类方法中传递实例变量是毫无意义的,而且过于工程化。您是对的,但在本例中没有这样做。问题是关于实例变量与参数的关系。这也是示例的内容。单元测试不应该成为决定是否参数化的原因。为了正确初始化这些实例变量,您可以始终使用适当的构造函数、setter或通过其他方式注入数据。有很多方法可以做到这一点……但没有真正的“一种正确的方法(tm)”:)这些实例变量和方法是同一个类的成员。为什么把它们传来传去???封装是通过字段访问修饰符和使用公共方法访问隐藏字段来实现的,而不是通过将字段传递到它们自己的类方法中来实现的。@I.K.问题是实例与参数。这就是问题和答案的意义所在。将实例成员作为参数在同一个实例中传递是荒谬的。@Mjoellnir如果您只为单元测试创建构造函数和setter,那么这不就和在类中使用并且逻辑上属于该类的变量一样糟糕吗,是否用作方法参数?@obesechicken13如果那些构造函数/设置器仅用于单元测试,则为。这也是不可取的。我通常在单元测试中使用反射,如果我在测试过程中遇到必须访问/初始化/验证某些内容的情况,那么在生产使用中,这些内容不能直接从外部或子类访问。