gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:27:08 25 4
gpt4 key购买 nike

我有一个 Plugin.java 类,其中定义了两种方法,一种使用 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(){...}
}

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

  • 因为我无法使用抽象类或 super 类,因为我已经扩展了 JobService 和 BroadcastReceiver。我知道 Java 不允许我扩展多个类,因为这会导致“菱形继承(钻石问题)”,编译器无法决定使用哪个父类(super class)方法。
  • 通过使用接口(interface),我只能声明没有实现(方法签名)的方法。
  • 我知道我可以使用静态和默认方法(使用接口(interface)),但它们是在 Java 8(Android Nougat - API 24)中引入的。因此,如果我使用它们,那么使用 JobScheduler (API >= 21) 和 AlarmManager (API < 21) 的整个逻辑将毫无意义。

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

最佳答案

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

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

}

关于java - 避免两次实现方法(已经扩展抽象类的类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49539107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com