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

Avoid implementing method twice (Classes already extending abstract classes)

我有一个 Plugin.java class,我在其中定义了两种方法,一种使用 JobScheduler(如果 API >= 21),另一种使用 AlarmManager(如果 API < 21).

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

两个 classes 调用 deleteOldEntries() 方法从数据库中删除旧条目。此方法对两者(JobService 和 BroadcastReceiver)都是相同的。 我想做的是避免有两种方法具有相同的实现。

我可以让另一个 class 实现该方法,然后从 ScheduleDeleteService (JobService) 和 ScheduleDeleteReceiver (BroadCastReceiver) classes 调用它,但我需要一些建议来帮助我做出更好的实现。

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

OldEntriesCleaner.java

interface OldEntriesCleaner {
    void deleteOldEntries();
}

主要activity

@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();
    }

}

我们可以在 Abstract Methods and Classes 中找到:

Consider using abstract classes if any of these statements apply to your situation:

  • You want to share code among several closely related classes.
  • ...

首先,我实现了 ScheduleDelete Abstract Class:

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

之后,在 ScheduleDeleteService 中 class 我调用了 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;
    }
}

在 ScheduleDeleteReceiver class 中,我调用了 ScheduleDelete#deleteOldEntries() 方法:

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