作为一名自学成才的编码员,我对编码最佳实践有疑问。我用两种不同的方式编写了相同的程序,我想有人给我指导哪种方式更受欢迎?这可能来自CPU开销或RAM使用,或者仅仅是编码最佳实践的角度。我很欣赏这个问题可能有很多答案或理论,我知道这不是Stack Overflow的用途,但对我来说这是一个Stack Overflow问题,因为我的编码风格给我带来了一些问题而我不知道知道我应该坚持哪种方法或采用。
这两个示例都有一个简单的XML布局文件,其中包含两个按钮和两个可更新的textview(此处未包含)。
示例1.(我现在倾向于编码的方式)
public class MainActivity extends Activity {
Button button1Add, button2Add;
TextView text1Display, text2Display;
int count1, count2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initilizeButtons();
setupListeners();
}
public void initilizeButtons() {
button1Add = (Button) findViewById(R.id.button1);
button2Add = (Button) findViewById(R.id.button2);
text1Display = (TextView) findViewById(R.id.textView1);
text2Display = (TextView) findViewById(R.id.textView2);
count1 = Integer.parseInt(text1Display.getText().toString());
count2 = Integer.parseInt(text2Display.getText().toString());
}
public void setupListeners() {
button1Add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
count1++;
text1Display.setText(String.valueOf(count1));
}
});
button2Add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
count2++;
text2Display.setText(String.valueOf(count2));
}
});
}
}
示例2.(我认为我应该编码的方式?)
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initilizeButtons();
}
public void initilizeButtons() {
Button button1Add = (Button) findViewById(R.id.button1);
Button button2Add = (Button) findViewById(R.id.button2);
button1Add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
TextView text1Display = (TextView) findViewById(R.id.textView1);
int headCount = Integer.parseInt(text1Display.getText().toString());
headCount++;
text1Display.setText(String.valueOf(headCount));
}
});
button2Add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
TextView text2Display = (TextView) findViewById(R.id.textView2);
int bodyCount = Integer.parseInt(text2Display.getText().toString());
bodyCount++;
text2Display.setText(String.valueOf(bodyCount));
}
});
}
}
在示例1中,我假设这将更快(即更少的CPU),因为我已经声明了我的变量并且只是在整个程序中添加它们。我在这里担心RAM的使用情况。
在示例2中,我认为这会导致更多的CPU使用率,因为每次使用它们都必须重新声明所有变量,但是它可能使用更少的RAM?
这些只是示例,我确信它们本身不会对CPU或RAM开销造成太大影响。我将把您提供的答案中的信息应用到我的一般编码实践中。
答案 0 :(得分:1)
我认为示例1应该是首选方式。
Ram的使用率并没有增加太多,因为如果您使用findViewById,则Widgets存在。您只能获得对所显示对象的引用。
我个人使用AndroidAnnotations这允许您删除initilizeButtons()
,因为您可以向字段添加一些注释,并且库会为您注入它们。看看他们在网站上的代码比较......真棒。它还支持许多其他不错的功能。最好的部分是,它使用代码生成而不是像其他类似的库一样使用运行时反射(成本和性能的成本)......
答案 1 :(得分:0)
这取决于您的需要,
在示例中,如果您的Activity对该视图使用了很多次,则选项2更好
答案 2 :(得分:0)
可能没有帮助,但我个人讨厌两种选择。在具有复杂布局的活动中,它将让您一次又一次地重复onclick方法代码。
考虑一下; (对不起,如果有任何错别字,请在记事本中进行)。 我没有关注其余代码,例如命名方法&#init; initilizeButtons'这是错误的拼写,加上误导,因为您不仅初始化按钮,还包括文本视图和整数。
public class MainActivity extends Activity implements OnClickListener {
Button button1Add, button2Add;
TextView text1Display, text2Display;
int count1, count2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initilizeButtons();
setupListeners();
}
public void initilizeButtons() {
button1Add = (Button) findViewById(R.id.button1);
button2Add = (Button) findViewById(R.id.button2);
text1Display = (TextView) findViewById(R.id.textView1);
text2Display = (TextView) findViewById(R.id.textView2);
count1 = Integer.parseInt(text1Display.getText().toString());
count2 = Integer.parseInt(text2Display.getText().toString());
}
public void setupListeners() {
button1Add.setOnClickListener(this);
button2Add.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch(view.getId()){
case R.id.button1:
// Do your button1 things
break;
case R.id.button2:
// do your button2 things
break;
}
}
}
答案 3 :(得分:0)
记忆和表现明智我看不出明显的区别。通常,建议保持声明变量的范围尽可能小。因此,如果在其余的活动中您不再需要按钮,请不要将它们声明为您班级中的字段。
我个人的经验是,使用许多匿名内部类会使代码难以阅读,因此要么去实现接口的活动,要么在封闭活动中创建小的命名内部类。