我正在开发两个具有相似但不完全相同的逻辑的Android应用程序,我想在它们之间共享代码。目前,我有一个针对每个应用程序的项目,以及一个用于共享类的附加项目。 shared-classes项目是一个库,应用程序项目链接到这个库。
我遇到的问题是一个负责从服务器获取数据并缓存该数据的类。该类称为DataSingleton。获取数据有一些逻辑对于两个应用程序都是相同的,有些逻辑是不同的。我的问题是如何设计类以支持这一点。
这里有一些限制:
如果这是C ++,我将有2个不同的类名为DataSingleton - 每个应用程序中有一个 - 然后让链接器连接正确的类。这两个类都可以从一些公共基类继承,以处理共享逻辑的代码共享。我可以用Java做类似的事情吗?
如果有帮助,我可以在应用程序开始时“初始化”DataSingleton,并使用一些参数来确定其行为。我想过将一个类传递给它,但是那个类没有访问DataSingleton的私有成员。
这样做的“正确”方法是什么?
答案 0 :(得分:1)
想想单身人士。它是一个做3 thigs的类: 1.它有一个业务逻辑 它创造了自己的实例 4.它拥有这个单一实例并提供对它的访问。
您希望拥有多个类的实现。这意味着您需要接口和/或抽象基类以及几个具体类。但在这种情况下,最好的解决方案是将#1与#2和#3分开:创建DataFetcher
的层次结构(对不起,我更改了您的名字DataSingleton
,因为它没有描述任何现实更多)和DataFetcherAccessor
:
interface DataFetcher {}
class DataFetcher1 implements DataFetcher{}
class DataFetcher2 implements DataFetcher{}
class DataFetcherAccessor<A extends DataFetcher> {
private static A accessor;
public static void setImpl(Class<A> c) {
accessor = c.newInstance();
}
public static A getAccessor() [
return accessor;
}
}
显然还有很多其他解决方案。例如,您可以使用SPI来查找界面的可用实现。您也可以自己扫描类路径并发现接口DataFetcher
的可用实现,或者使用Reflections。
答案 1 :(得分:0)
剥离需要在不同项目中更改的部分的共享项目中的DataSingleton
,将其定义为抽象类并将其名称更改为AbstractDataSingleton
或类似的内容,然后只需在每个名为DataSingleton
的产品中创建2个单独的类或其他类,并使它们扩展共享项目中的AbstractDataSingleton
。