Java 抽象方法的空实现是一种好方法吗?
我正在为我的Android应用程序使用两种不同的分析服务(Google Analytics和Mixpanel) 我创建了一个抽象基类,如下所示:Java 抽象方法的空实现是一种好方法吗?,java,android,design-patterns,Java,Android,Design Patterns,我正在为我的Android应用程序使用两种不同的分析服务(Google Analytics和Mixpanel) 我创建了一个抽象基类,如下所示: public abstract class AnalyticsService { public abstract void trackAppOpen(); public abstract void identifyUserOnLogin(); } 然后我创建了从AnalyticsService基类扩展而来的具体子类 public
public abstract class AnalyticsService {
public abstract void trackAppOpen();
public abstract void identifyUserOnLogin();
}
然后我创建了从AnalyticsService基类扩展而来的具体子类
public class MPAnalytics extends AnalyticsService {
@Override
public void trackAppOpen() {
//Send event to MixPanel
}
@Override
public void identifyUserOnLogin() {
//Identify user with MixPanel
}
}
public class GoogleAnalytics extends AnalyticsService {
@Override
public void trackAppOpen() {
//Send event to Google
}
@Override
public void identifyUserOnLogin() {
//Do nothing
}
}
现在Google Analytics实际上不支持用户识别,所以我不得不创建一个registerUserOnLogin()
方法的空实现
我觉得这可能不是正确的方法,因为用户识别不是谷歌分析的行为,因此理想情况下,它不应该是基本AnalyticsService
类的一部分,而应该在MPAnalytics
类中定义
但这种方法的问题在于客户端,我希望能够通过使用baseAnalyticsService
类引用所有不同的分析服务,而不必担心具体的实现
List<AnalyticsService> analyticsServices;
for (AnalyticsService service : analyticsServices) {
service.trackAppOpen();
service.identifyUserOnLogin(); // where should this method be?
}
列出分析服务;
用于(分析服务:分析服务){
service.trackAppOpen();
service.identifyUserOnLogin();//此方法应位于何处?
}
有更好的方法吗?谢谢。如果您可以使用界面,请使用。
为什么-->以防以后因为其他原因必须继承母类。
别忘了您可以只继承一次我看不出空占位符有什么问题。如果有人试图使用Google Analytics的方法或抛出异常,您可以记录一些内容。Java 8还支持接口中的默认方法。可以使用默认的空方法定义接口。参考:基本上,我觉得GoogleAnalytics类最好实现一个接口,而不是从一个与它没有真正“is a”关系的类进行扩展。也许你可以调用方法
IdentificationUserOnloginifEssential
,以更加强调实现可能是空的这一事实。如果没有共享的实现细节,我也会使用接口而不是抽象类,即使有,也可以使用抽象类实现接口。但是,如果每个方法都是这样的话,那么不用麻烦了,将实现留空也没关系。@mdewi即使我将AnalyticsService
定义为一个接口,我仍然会遇到同样的问题。虽然如果我定义了两个接口,让我们假设EventsTracker
和UserIdentifier
来分离这两个行为,并使MixPanelAnalytics
实现这两个接口,使GoogleAnalytics
只实现EventsTracker
接口。这在逻辑上是有道理的,但现在在客户机上,我没有一种类型可以同时引用这两种类型。现在,我的客户机中没有AnalyticsService
列表,而是有一个MixPanelAnalytics
和一个GoogleAnalytics
,如果以后需要添加另一个,这将导致问题。