全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

在java中如何定义一个抽象属性示例详解

前言

本文主要给大家介绍的是在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小时内与您取得联系。