前言

本文主要给大家介绍的是在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抽象定义以及举例代码
# 子类
# 分隔符
# 将会
# 两种
# 类中
# 自己的
# 如果你
# 是在
# 相关内容
# 就能
# 说了
# 可以用
# 不多
# 所需
# 我们可以
# 可以通过
# 给大家
# 是怎样
# 做一个
# 不支持
相关文章:
免费网站制作appp,免费制作app哪个平台好?
如何快速打造个性化非模板自助建站?
建站之星如何优化SEO以实现高效排名?
如何快速选择适合个人网站的云服务器配置?
javascript中对象的定义、使用以及对象和原型链操作小结
网站制作网站,深圳做网站哪家比较好?
建站之星导航配置指南:自助建站与SEO优化全解析
如何用景安虚拟主机手机版绑定域名建站?
,在苏州找工作,上哪个网站比较好?
html制作网站的步骤有哪些,iapp如何添加网页?
如何选择建站程序?包含哪些必备功能与类型?
北京网站制作公司哪家好一点,北京租房网站有哪些?
广平建站公司哪家专业可靠?如何选择?
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
深圳网站制作的公司有哪些,dido官方网站?
如何快速生成ASP一键建站模板并优化安全性?
如何制作网站标识牌,动态网站如何制作(教程)?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
如何通过PHP快速构建高效问答网站功能?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?
建站主机无法访问?如何排查域名与服务器问题
济南企业网站制作公司,济南社保单位网上缴费步骤?
,巨量百应是干嘛的?
h5网站制作工具有哪些,h5页面制作工具有哪些?
淘宝制作网站有哪些,淘宝网官网主页?
如何将凡科建站内容保存为本地文件?
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
宁波自助建站系统如何快速打造专业企业网站?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
小型网站制作HTML,*游戏网站怎么搭建?
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
建站之星如何快速生成多端适配网站?
建站之星与建站宝盒如何选择最佳方案?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
建站之星会员如何解锁更多建站功能?
建站之星免费模板:自助建站系统与智能响应式一键生成
头像制作网站在线制作软件,dw网页背景图像怎么设置?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
家具网站制作软件,家具厂怎么跑业务?
建站之星如何实现网站加密操作?
c# await 一个已经完成的Task会发生什么
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
安云自助建站系统如何快速提升SEO排名?
c# 在ASP.NET Core中管理和取消后台任务
建站之星代理商如何保障技术支持与售后服务?
*请认真填写需求信息,我们会在24小时内与您取得联系。