Java 避免两次实现方法(类已经扩展了抽象类)

Java 避免两次实现方法(类已经扩展了抽象类),java,android,alarmmanager,jobservice,Java,Android,Alarmmanager,Jobservice,我有一个Plugin.java类,我在其中定义了两个方法,一个在API>=21时使用JobScheduler,另一个在API=21和AlarmManager API

我有一个Plugin.java类,我在其中定义了两个方法,一个在API>=21时使用JobScheduler,另一个在API<21时使用AlarmManager

@Override
public void onCreate() {
    super.onCreate();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        scheduleDeleteJobScheduler(...);
    } else {
        scheduleDeleteAlarmManager(...);
    }
}
scheduleDeleteJobScheduler方法使用JobService删除数据库中的一些旧条目

public class ScheduleDeleteService extends JobService {

    @Override
    public boolean onStartJob(JobParameters params) {
        deleteOldEntries();
        jobFinished(params, false);
        return false;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return false;
    }

    public void deleteOldEntries(){...}
}
scheduleDeleteAlarmManager方法使用BroadcastReceiver执行与JobService相同的操作

public class ScheduleDeleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        deleteOldEntries();
    }

    public void deleteOldEntries(){...}
}
这两个类都调用deleteOldEntries方法从数据库中删除旧条目。此方法对于JobService和BroadcastReceiver都是相同的。 我想做的是避免使用两个具有相同实现的方法

因为我已经在扩展JobService和BroadcastReceiver,所以不能使用抽象类或超类。我知道Java不允许我扩展多个类,因为它会导致菱形问题,编译器无法决定使用哪个超类方法。 通过使用接口,我只能声明没有实现方法签名的方法。
我知道我可以使用接口使用静态和默认方法,但它们是在Java8AndroidNougat-API24中引入的。因此,如果我使用它们,那么使用JobScheduler API>=21和AlarmManager API<21的整个逻辑将毫无意义。
我可以让另一个类实现该方法,然后从ScheduleDeleteService JobService和ScheduleDeleteReceiver BroadCastReceiver类调用它,但是我希望得到一些建议来帮助我更好地实现。

还有一个选择:您可以按照接口的想法,将实现放在一个匿名类中。因此,您需要一个单独的接口和实现类,但只需要一个额外的文件。当然,如果可能的话,使用默认方法/多重继承的解决方案看起来会更优雅

OldEntriesCleaner.java

主要活动

服务

我们可以在以下内容中找到:

如果以下任何语句适用于您的情况,请考虑使用抽象类:

您希望在几个密切相关的类之间共享代码。 ... 首先,我实现了ScheduleDelete抽象类:

abstract class ScheduleDelete {
    public void deleteOldEntries(){ ... }
}
之后,在ScheduleDeleteService类内部调用ScheduleDeleteOldEntries方法:

public class ScheduleDeleteService extends JobService {

    @Override
    public boolean onStartJob(JobParameters params) {
        (new ScheduleDelete(){}).deleteOldEntries();
        jobFinished(params, false);
        return false;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return false;
    }
}
public class ScheduleDeleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        (new ScheduleDelete(){}).deleteOldEntries();
    }
}
在ScheduleDeleteReceiver类中,我调用ScheduleDeleteOldEntries方法:

public class ScheduleDeleteService extends JobService {

    @Override
    public boolean onStartJob(JobParameters params) {
        (new ScheduleDelete(){}).deleteOldEntries();
        jobFinished(params, false);
        return false;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return false;
    }
}
public class ScheduleDeleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        (new ScheduleDelete(){}).deleteOldEntries();
    }
}

但它们是在Java8Android Nougat-API24中引入的,并且在所有版本的Android上都可以使用。或者,创建一个处理删除逻辑的类,让ScheduleDeleteService和ScheduleDeleteReceiver创建并使用该类的实例。或者,在某个地方使用一个简单的静态方法。@commonware谢谢,我将使用一个接口。
public class ScheduleDeleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        (new ScheduleDelete(){}).deleteOldEntries();
    }
}