前言

本文主要给大家介绍的是在java中定义一个抽象属性的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:
Abstract关键字通常被用于类和方法,用来把某些行为的实现委托给子类。由于Java不支持抽象属性,如果你试图将类属性标记为抽象,将会得到一个编译时错误。
在本教程中,我们将介绍两种定义抽象属性的方法,这些抽象属性可以由子类进行设置,而且不使用Abstract 关键字。
实用案例
假设我们想要实现一个记录事务的日志模块,用来记录特定事务的信息。我们希望这个模块是抽象的,这样我们可以实现不同的日志记录方式,例如:记录到文件或数据库中。
我们的引擎使用预定义的分隔符来连接日志中的信息,并存储在一个String中。具体应该使用哪个分隔符,这将取决于日志记录的规则,例如可以用字符“,”对日志记录中不同部分的信息进行分割。
因此,分隔符看起来对我们的引擎是抽象的,需要由每个日志记录规则明确定义。
下面我提供两种方式,来实现把分隔符的定义委托给子类。
在抽象类中定义带参数的构造函数
在抽象类中定义动态属性的第一种方法是:定义一个参数的构造函数。
所以我们可以这样实现这个引擎:
// TransactionManager.java
public abstract class TransactionManager {
private String separator;
public TransactionManager(String separator) {
this.separator = separator;
}
public abstract void writeTransaction(String result);
public Transaction startTransaction()
{
Transaction transaction = new Transaction(System.currentTimeMillis());
return transaction;
}
public void endTransaction(Transaction t) {
long processingTime = System.currentTimeMillis() - t.getStartTime();
StringBuilder logBuilder = new StringBuilder();
logBuilder.append(t.getStartTime());
// Notice the use of this.separator
logBuilder.append(this.separator);
logBuilder.append(processingTime);
logBuilder.append(this.separator);
logBuilder.append(t.getData());
String result = logBuilder.toString();
writeTransaction(result);
}
}
在抽象类中定义带参数的构造函数时,子类将会被强制定义自己的构造函数并调用super() 。 这样我们就能强制separator属性依赖于已使用的日志记录机制。
注意:我们的引擎实现了所有日志机制共有的静态行为:startTransaction() , endTransaction() ,同时将动态行为writeTransaction()交给子类去实现。
现在,如果我们想要创建一个事务管理器,用它将日志内容记录到一个文件中,那么可以这样去定义:
public class TransactionManagerFS extends TransactionManager{
// The IDE forces you to implement constructor.
public TransactionManagerFS(String separator) {
super(separator);
}
@Override
public void writeTransaction(String result) {
System.out.println("The following transaction has just finished: " );
System.out.println(result);
}
}
接下来做一个测试,看看代码是怎样工作的
public static void main(String[] args) throws InterruptedException {
// we pass the separator explicitly in the constructor
TransactionManager transactionManager = new TransactionManagerFS(",");
Transaction transaction = transactionManager.startTransaction();
transaction.setData("This is a test transaction !!");
Thread.sleep(1500);
transactionManager.endTransaction(transaction);
}
输出:
The following transaction has just finished: 1502179140689,1501,This is a test transaction !!
通过getter方法传递分隔符
另外一种实现动态属性的方法是:通过定义一个抽象的getter方法,该方法根据当前的日志记录机制来检索所需的分隔符。在我们的引擎中,当需要要使用分隔符时,可以通过调用这个getter方法得到。
接下来我们将引擎修改成这样:
public abstract class TransactionManager {
public abstract String getSeperator();
public abstract void writeTransaction(String result);
public Transaction startTransaction()
{
Transaction transaction = new Transaction(System.currentTimeMillis());
return transaction;
}
public void endTransaction(Transaction t) {
long processingTime = System.currentTimeMillis() - t.getStartTime();
StringBuilder logBuilder = new StringBuilder();
logBuilder.append(t.getStartTime());
// Notice the use of getSeparator()
logBuilder.append(getSeperator());
logBuilder.append(processingTime);
logBuilder.append(getSeperator());
logBuilder.append(t.getData());
String result = logBuilder.toString();
writeTransaction(result);
}
}
另外修改TransactionManagerFS如下:
public class TransactionManagerFS extends TransactionManager{
@Override
public String getSeperator() {
return ",";
}
@Override
public void writeTransaction(String result) {
System.out.println("The following transaction has just finished: " );
System.out.println(result);
}
}
然后,修改main以使用新的实现,并确保得到正确的结果。
public static void main(String[] args) throws InterruptedException {
// The separator is defined implicitly using getSeparator() method of the manager
TransactionManager transactionManager = new TransactionManagerFS();
Transaction transaction = transactionManager.startTransaction();
transaction.setData("This is a test transaction !!");
Thread.sleep(1500);
transactionManager.endTransaction(transaction);
}
输出:
The following transaction has just finished: 1502179140689,1501,This is a test transaction !!
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
翻译:疯狂的技术宅
原文:http://programmergate.com/define-abstract-property-java/
本文首发微信公众号:充实的脑洞
# java
# 抽象属性
# 抽象类
# 属性
# java抽象的定义
# Java 抽象类定义与方法实例详解
# Java抽象类和抽象方法定义与用法实例详解
# 深入浅出分析Java抽象类和接口【功能
# 定义
# 用法
# 区别】
# java抽象类和接口定义与用法详解
# Java抽象定义以及举例代码
# 子类
# 分隔符
# 将会
# 两种
# 类中
# 自己的
# 如果你
# 是在
# 相关内容
# 就能
# 说了
# 可以用
# 不多
# 所需
# 我们可以
# 可以通过
# 给大家
# 是怎样
# 做一个
# 不支持
相关文章:
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
南宁网站建设制作定制,南宁网站建设可以定制吗?
如何在自有机房高效搭建专业网站?
潮流网站制作头像软件下载,适合母子的网名有哪些?
建站之星如何助力网站排名飙升?揭秘高效技巧
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
如何在Windows虚拟主机上快速搭建网站?
如何在阿里云虚拟服务器快速搭建网站?
宝塔面板创建网站无法访问?如何快速排查修复?
实例解析Array和String方法
公司网站制作需要多少钱,找人做公司网站需要多少钱?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
动图在线制作网站有哪些,滑动动图图集怎么做?
西安专业网站制作公司有哪些,陕西省建行官方网站?
建站主机类型有哪些?如何正确选型
子杰智能建站系统|零代码开发与AI生成SEO优化指南
大连网站设计制作招聘信息,大连投诉网站有哪些?
网站制作需要会哪些技术,建立一个网站要花费多少?
建站之星如何一键生成手机站?
昆明高端网站制作公司,昆明公租房申请网上登录入口?
建站之星后台密码如何安全设置与找回?
大同网页,大同瑞慈医院官网?
建站主机系统SEO优化与智能配置核心关键词操作指南
电商平台网站制作流程,电商网站如何制作?
如何在局域网内绑定自建网站域名?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
Java解压缩zip - 解压缩多个文件或文件夹实例
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
建站10G流量真的够用吗?如何应对访问高峰?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
c# 在高并发场景下,委托和接口调用的性能对比
公司网站制作价格怎么算,公司办个官网需要多少钱?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
活动邀请函制作网站有哪些,活动邀请函文案?
如何在建站宝盒中设置产品搜索功能?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
建站之星安装模板失败:服务器环境不兼容?
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
相册网站制作软件,图片上的网址怎么复制?
网站专业制作公司有哪些,做一个公司网站要多少钱?
如何生成腾讯云建站专用兑换码?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
建站主机解析:虚拟主机配置与服务器选择指南
实现点击下箭头变上箭头来回切换的两种方法【推荐】
微信h5制作网站有哪些,免费微信H5页面制作工具?
香港服务器如何优化才能显著提升网站加载速度?
建站之星2.7模板快速切换与批量管理功能操作指南
*请认真填写需求信息,我们会在24小时内与您取得联系。