我正在学习一些有关Java语言的教程。我想知道每次编写代码时,是否应该抽象,以及任何类型的标准和堆栈?
我已经看到,对于每个Spring Services,我们甚至可以使用JavaEE堆栈上的EJB接口等抽象控制器。
我想知道那是什么目的?使用Android SDK开发时我应该做同样的事情吗?
我应该抽象出每个编码的类吗?
答案 0 :(得分:5)
制作模块化,可重用组件始终是个好主意。当一个应用程序从头开始构建时,它会变得越来越可伸缩,越来越多自我扩展。应用程序中的相同组件会在添加新功能时重复使用,从而节省时间和精力。以后更容易进行更改或识别错误源。重构永远不应该在之后,而是从一开始。
话虽如此,仅仅为了“抽象”而在移动应用中拥有越来越多的抽象并不是一个好主意。当然,原因在于智能手机不如服务器甚至台式计算机那么强大。 Android应用程序中的每个类和虚拟方法都存在性能损失。需要在“抽象”和效率之间取得更大的平衡,并且性能权衡在中低端设备上变得更加明显。
来自官方文档:
1。 Be careful with code abstractions
2。 Avoid dependency injection frameworks
3。 Avoid Creating Unnecessary Objects
5. Avoid Internal Getters/Setters
修改强>
在最近试用Dagger之后,我不得不承认第2点现在可能有点过时了。我能说什么......我很晚才来到Dagger派对。
答案 1 :(得分:2)
只要您有一个不想实现其所有方法的类,就需要抽象。那些继承它的类将被强制实现所有这些方法,否则你需要将子类声明为抽象。
除此之外你应该知道接口,接口的方法必须没有body,好的是你的类可以像你想要的那样实现接口。然而,您只能继承一个抽象类。接口就像合同。无论哪个类实现它们都需要为所有方法提供主体。
是否需要抽象或界面或两者都取决于您的设计和您想要实现的内容。虽然强制那些具有通用方法的类实现相同的接口(如果你对每个方法的主体一无所知)或抽象(如果你知道某些,全部或没有方法)
另一个例子是当你有抽象或接口时,如果你向它们添加一些东西,所有子类或实现它们的类都需要遵循这些修改,这意味着可能更容易修改。
同时查看this,this和this以及open/close principle。
答案 2 :(得分:1)
这可以用许多不同的方式来解释。在我看来,在需要扩展或许多类型的实现的情况下,抽象被用于编码作为设计原则。例如,在Spring中,控制器可能已经定义为抽象类(A)并且有几个其他类型的控制器(B,C,D ..)扩展A.作为Spring框架的用户,如果你不满意在可用的控制器实现中,您仍然可以开发自己的控制器扩展A.此外,Spring开发人员也可以轻松扩展/添加新控制器。
答案 3 :(得分: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));
}
}