在Android中使用Java进行抽象

时间:2015-03-06 11:26:56

标签: java android refactoring abstraction modularity

我正在学习一些有关Java语言的教程。我想知道每次编写代码时,是否应该抽象,以及任何类型的标准和堆栈?

我已经看到,对于每个Spring Services,我们甚至可以使用JavaEE堆栈上的EJB接口等抽象控制器。

我想知道那是什么目的?使用Android SDK开发时我应该做同样的事情吗?

我应该抽象出每个编码的类吗?

4 个答案:

答案 0 :(得分:5)

制作模块化可重用组件始终是个好主意。当一个应用程序从头开始构建时,它会变得越来越可伸缩,越来越多自我扩展。应用程序中的相同组件会在添加新功能时重复使用,从而节省时间和精力。以后更容易进行更改或识别错误源。重构永远不应该在之后,而是从一开始。

话虽如此,仅仅为了“抽象”而在移动应用中拥有越来越多的抽象并不是一个好主意。当然,原因在于智能手机不如服务器甚至台式计算机那么强大。 Android应用程序中的每个类和虚拟方法都存在性能损失。需要在“抽象”和效率之间取得更大的平衡,并且性能权衡在中低端设备上变得更加明显。

来自官方文档:

1。 Be careful with code abstractions

2。 Avoid dependency injection frameworks

3。 Avoid Creating Unnecessary Objects

4。 Prefer Static Over Virtual

5. Avoid Internal Getters/Setters

修改

在最近试用Dagger之后,我不得不承认第2点现在可能有点过时了。我能说什么......我很晚才来到Dagger派对。

答案 1 :(得分:2)

只要您有一个不想实现其所有方法的类,就需要抽象。那些继承它的类将被强制实现所有这些方法,否则你需要将子类声明为抽象。

除此之外你应该知道接口,接口的方法必须没有body,好的是你的类可以像你想要的那样实现接口。然而,您只能继承一个抽象类。接口就像合同。无论哪个类实现它们都需要为所有方法提供主体。

是否需要抽象或界面或两者都取决于您的设计和您想要实现的内容。虽然强制那些具有通用方法的类实现相同的接口(如果你对每个方法的主体一无所知)或抽象(如果你知道某些,全部或没有方法)

另一个例子是当你有抽象或接口时,如果你向它们添加一些东西,所有子类或实现它们的类都需要遵循这些修改,这意味着可能更容易修改。

同时查看thisthisthis以及open/close principle

答案 2 :(得分:1)

这可以用许多不同的方式来解释。在我看来,在需要扩展或许多类型的实现的情况下,抽象被用于编码作为设计原则。例如,在Spring中,控制器可能已经定义为抽象类(A)并且有几个其他类型的控制器(B,C,D ..)扩展A.作为Spring框架的用户,如果你不满意在可用的控制器实现中,您仍然可以开发自己的控制器扩展A.此外,Spring开发人员也可以轻松扩展/添加新控制器。

答案 3 :(得分:0)

可重用性。放手!

如果您的班级有

  • 重复代码
  • 针对不同情况的非重复代码。

然后,最好声明类 Abstract

将重复的代码放入抽象类中,并为将要不同的代码创建抽象方法。

  

这里是一个例子。

注册和注销任何BroadcastReceiver

  

抽象类

public abstract class BaseReceiverActivity extends AppCompatActivity{

   private BroadCastReceiver receiver;
   private IntentFilter filter;

   public abstract BroadCastReceiver getReceiver();
   public abstract IntentFilter getFilter();

   @Override
   public void onStart(){
       super.onStart();
       configureReceiver()
       registerReceiver(receiver, filter);
   }

   @Override
   public void onStop(){
       super.onPause();
       unregisterReceiver(receiver);
   }

   private void registerMyReceiver(){        
       registerReceiver(receiver, filter);    
   }

   private void configureReceiver(){
        receiver = getReceiver();
        filter   = getFilter();
   }

}
  

实施课程:

public class WifiScanner extends BaseReceiverActivity{

   @Override
   public void onCreate(Bundle sis){
        super.onCreate(sis);
        setContentView(R.layout.yourLayout);
   }

   @Override
   public BroadCastReceiver getReceiver(){
        return new YourReceiver();
   }

   @Override
   public IntentFilter getFilter(){
        return IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
   }

}