[Android中的Java抽象

问题描述 投票:7回答:4

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

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

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

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

java android refactoring abstraction modularity
4个回答
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之后,我不得不承认,现在第二点可能有点过时了。我能说什么...我参加了Dagger派对很晚。


2
投票

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

除了您应该了解接口之外,接口的方法必须没有主体,而且好处是您的类可以实现所需的尽可能多的接口。而您只能继承一个抽象类。接口就像合同。无论使用哪种类实现,都需要为其所有方法提供主体。

您是否需要抽象或接口,还是两者都取决于您的设计和要实现的内容。虽然最好强迫具有共同方法的类实现相同的接口(如果您不了解每种方法的主体,则不要实现)或抽象(如果您知道某些,全部或不主体的主体),方法)

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

同时查看thisthisthisopen/close principle


1
投票

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


0
投票

可重用性。放手!

如果您的班级有一个

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

然后,声明类Abstract是一个好主意。

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

这里是一个例子。

注册和注销任何广播接收器

抽象类

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

}
© www.soinside.com 2019 - 2024. All rights reserved.