Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 抽象方法的空实现是一种好方法吗?_Java_Android_Design Patterns - Fatal编程技术网

Java 抽象方法的空实现是一种好方法吗?

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

我正在为我的Android应用程序使用两种不同的分析服务(Google Analytics和Mixpanel)

我创建了一个抽象基类,如下所示:

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
类中定义

但这种方法的问题在于客户端,我希望能够通过使用base
AnalyticsService
类引用所有不同的分析服务,而不必担心具体的实现

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
,如果以后需要添加另一个,这将导致问题。