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如果那些构造函数/设置器仅用于单元测试,则为。这也是不可取的。我通常在单元测试中使用反射,如果我在测试过程中遇到必须访问/初始化/验证某些内容的情况,那么在生产使用中,这些内容不能直接从外部或子类访问。