2013-03-13 35 views
0

作为一名自学的编码员,我有一个关于编码最佳实践的问题。我已经用两种不同的方式编写了相同的程序,我希望有人给我哪个方向更好的指导?这可能来自CPU开销或RAM使用,或者仅仅是编码最佳实践观点。我很感谢这个问题可能有很多答案或理论,我知道这不是堆栈溢出在这里,但对我来说这是一个堆栈溢出的问题,因为我的编码风格导致我一些问题,我不知道我应该坚持或采用哪种方法。Java/Android哪个编码方法更好?

这两个示例都有一个简单的XML布局文件,其中包含两个按钮和两个可更新的文本浏览(这里未包含)。

实施例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个I(I倾向于在时刻进行编码的方式)假设这会更快(即更少的CPU),因为我声明了我的变量,并在整个程序中添加它们。我在这里担心RAM的使用。

在示例2中,我认为这会导致更多的CPU使用率,因为每次使用时都必须重新声明所有变量,但是可能使用的RAM更少?

这些只是简单的例子,我相信他们自己不会在CPU或RAM开销方面造成太大影响。我会将您提供的答案中的信息应用于我的一般编码练习。

+0

您是否有性能/内存问题?如果不是,那么请记住:过早优化是所有邪恶的根源......顺便说一下,现在参考文献并不被视为记忆成本。有太多的引用(而不是正确维护它们)可能会导致内存泄漏... – ppeterka 2013-03-13 13:08:53

+4

您可能想要重新发布到codereview.stackexchange.com。这些是他们关注的问题。 – Perception 2013-03-13 13:11:10

+0

你想知道你的问题。请先清楚你的问题,以便其他人可以最好地回答你。 – 2013-03-13 13:11:46

回答

1

我想例如1应该是首选的方式。

Ram的用法并没有太大的增加,因为如果你使用findViewById或者没有,Widgets是存在的。您只能看到所示对象的参考。

我个人使用AndroidAnnotations这允许你删除initilizeButtons(),因为你可以添加一些注解到字段中,并且库为你注入它们。看看他们的网站上的代码比较...它的真棒。而且它还支持许多其他不错的功能。最好的部分是,它使用代码生成,而不是使用运行时反射(成本CPU和性能)像其他类似的图书馆...

+0

也感谢您的链接,看起来像一个很好的图书馆。 – Purplemonkey 2013-03-13 14:02:14

0

这取决于你的需要,

例如,如果你的活动多次使用与查看,选项2更好

0

可能没有帮助,但我其实亲自恨这两个选项。在布局复杂的活动中,您需要一次又一次重复onclick方法代码。

考虑一下; (对不起,如果有任何错别字,记事本)。 我没有专注于其他代码,例如命名方法'initilizeButtons',这是不正确的拼写,加上误导,因为你不仅仅是初始化按钮,而且textviews和整数。

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; 
     } 
    } 

} 
0

内存和性能明智我看不出有什么明显的区别。一般来说,建议保持声明变量的范围尽可能小。因此,如果在其余的活动中不再需要按钮,请不要将它们声明为班级中的字段。

我个人的经验是,使用许多匿名内部类会使代码难以阅读,因此请执行实现接口的活动,或者在封闭活动中创建小型命名内部类。