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



我有一个Plugin.java类,其中我定义了两种方法,一种用于使用JobsCheduler(如果API> = 21(,其他用于使用AlarmManager(如果API&lt; 21(。<<<<<<<<<<<<<<<<<<<</p>

@Override
public void onCreate() {
    super.onCreate();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        scheduleDeleteJobScheduler(...);
    } else {
        scheduleDeleteAlarmManager(...);
    }
}

scheduledeletejobscheduler((方法使用工作服务来删除我在数据库中拥有的一些旧条目。

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(){...}
}

senduledeleteletealarmmanager((方法使用broadcastreceiver与工作服务相同。

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

两个类都调用deleteoldentries((方法从数据库中删除旧条目。此方法对于(就业服务和广播员(都是平等的。我想做的是避免使用平等实现的两种方法。

  • 因为我已经扩展了工作服务和广播媒介,因为我无法使用摘要或超级类。我知道Java不允许我扩展多个类,因为它将导致编译器无法决定使用哪种超类方法的"钻石问题"。
  • 通过使用接口,我只能在没有实现的情况下声明该方法(方法签名(。
  • 我知道我可以使用静态和默认方法(使用接口(,但是它们是在Java 8中引入的(Android Nougat -API 24(。因此,如果我使用了它们,则使用JobsCheduler(API> = 21(和AlarmManager(API&LT; 21(的整个逻辑将没有任何意义。

我可以让另一个类实施该方法,只需从计划登机服务(工作服务(和ScheduleDeleDeleCeiver(BroadcastreCeiver(类中调用它,但我希望一些建议可以帮助我更好地实施。

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

oldentriesCleaner.java

interface OldEntriesCleaner {
    void deleteOldEntries();
}

主要活动

@Override
public void onCreate() {
    super.onCreate();
    OldEntriesCleaner cleaner = new OldEntriesCleaner() {
        @Override
        public void deleteOldEntries() {
            // Do the work here
        }
    };
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        scheduleDeleteJobScheduler(..., cleaner)
    } else {
        scheduleDeleteAlarmManager(..., cleaner)
    }
}

服务

public class ScheduleDeleteReceiver extends BroadcastReceiver {
    private OldEntriesCleaner cleaner;
    public ScheduleDeleteReceiver(OldEntriesCleaner cleaner) {
        this.cleaner = cleaner;
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        cleaner.deleteOldEntries();
    }
}

我们可以在抽象方法和类中找到:

如果这些语句适用于您的情况,请考虑使用抽象类:

  • 您想在几个密切相关的类中共享代码。
  • ...

首先,我实现了ScheduleDelete摘要类:

abstract class ScheduleDelete {
    public void deleteOldEntries(){ ... }
}

之后,在ScheduleDeletService类中,我致电ScheduleDelete#deleteoldentries((方法:

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

和在ScheduleDeledeceiver类中I列出了ScheduleDelete#deleteoldentries((方法:

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

相关内容

  • 没有找到相关文章

最新更新