全网整合营销服务商

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

免费咨询热线: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抽象定义以及举例代码  # 子类  # 分隔符  # 将会  # 两种  # 类中  # 自己的  # 如果你  # 是在  # 相关内容  # 就能  # 说了  # 可以用  # 不多  # 所需  # 我们可以  # 可以通过  # 给大家  # 是怎样  # 做一个  # 不支持 


相关文章: 免费网站制作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小时内与您取得联系。