抽象关键字通常应用于类和方法,以便将某些行为的实现委托给子类。
Java不支持抽象属性,如果您试图将类属性标记为抽象,则会得到编译错误。
在本教程中,将介绍两种定义抽象属性的方法,这些属性由子类设置,而不使用抽象关键字。
一、实用案例
假设我们要实现一个事务日志模块,该模块记录关于特定事务的信息。
我们希望我们的模块是抽象的,这样我们就能够支持不同的日志记录方式:
文件系统日志记录、数据库日志记录等等。
我们的引擎使用依赖于日志记录机制的预定义分隔符将所有事务信息连接在一个字符串中,例如逗号字符“”用于在文件系统中记录逗号分隔的字符串。
因此,分隔符对我们的引擎来说是抽象的,需要由每种日志记录机制显式地定义。
二、定义抽象属性
在本节中,我们提供了两种将分隔符的定义委托给子类的方法。
在抽象类中定义参数化构造函数
在抽象类中委托动态属性定义的第一种方法是定义参数化构造函数。
所以我们创建的引擎如下:
在抽象类中定义参数化构造函数时,子类必须定义自己的构造函数并调用父构造函数。
因此,我们强制separator属性依赖于所使用的日志记录机制。
如前所述,我们的引擎提供了静态行为的实现,这些静态行为在所有日志记录机制之间都很常见。
比如:startTransaction()、endTransaction(),而它将动态行为writeTransaction()委托给子类。
现在,如果我们想创建一个记录到文件系统的事务管理器,我们将它定义为:
让我们做一些测试,看看上面的实现是如何工作的:
输出:
三、通过getter方法传递分隔符
另一种委托动态属性定义的方法是定义抽象getter方法,该方法根据使用的日志记录机制检索所需的分隔符。
在我们的引擎中,当我们想使用分隔符时,我们就使用getter方法。
所以我们修改我们的引擎如下:
TransactionManagerFS分别为:
然后更新main类以使用新的实现,并确保得到相同的结果。
输出:
好了今天的分享就到这里结束了,喜欢可以帮助到大家学习小伙伴可以关注我哦!有学习方面的问题可以私信回复:学习!