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


Posted in Python onAugust 18, 2017

前言

本文主要给大家介绍的是在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/

本文首发微信公众号:充实的脑洞

Python 相关文章推荐
python列表去重的二种方法
Feb 14 Python
python学习笔记之调用eval函数出现invalid syntax错误问题
Oct 18 Python
Python图算法实例分析
Aug 13 Python
详解Python发送email的三种方式
Oct 18 Python
python解析含有重复key的json方法
Jan 22 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
Jul 15 Python
对django 模型 unique together的示例讲解
Aug 06 Python
Python查找不限层级Json数据中某个key或者value的路径方式
Feb 27 Python
使用python处理题库表格并转化为word形式的实现
Apr 14 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
Jun 03 Python
python如何支持并发方法详解
Jul 25 Python
python+selenium爬取微博热搜存入Mysql的实现方法
Jan 27 Python
python中将函数赋值给变量时需要注意的一些问题
Aug 18 #Python
python中子类调用父类函数的方法示例
Aug 18 #Python
Python设计实现的计算器功能完整实例
Aug 18 #Python
python中类和实例如何绑定属性与方法示例详解
Aug 18 #Python
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
Aug 18 #Python
对python中return和print的一些理解
Aug 18 #Python
浅析Python中return和finally共同挖的坑
Aug 18 #Python
You might like
解决Codeigniter不能上传rar和zip压缩包问题
2014/03/07 PHP
PHP实现的博客欢迎提示功能(很特别哦)
2014/06/05 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
thinkphp5.1框架模板布局与模板继承用法分析
2019/07/19 PHP
详解Laravel设置多态关系模型别名的方式
2019/10/17 PHP
论坛里点击别人帖子下面的回复,回复标题变成“回复 24# 的帖子”
2009/06/14 Javascript
JavaScript 异步调用框架 (Part 1 - 问题 & 场景)
2009/08/03 Javascript
JS延迟加载(setTimeout) JS最后加载
2010/07/15 Javascript
jQuery对表单的操作代码集合
2011/04/06 Javascript
javascript代码编写需要注意的7个小细节小结
2011/09/21 Javascript
浅析Node.js查找字符串功能
2014/09/03 Javascript
zepto.js中tap事件阻止冒泡的实现方法
2015/02/12 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
[原创]SyntaxHighlighter自动识别并加载脚本语言
2017/02/07 Javascript
基于Bootstrap分页的实例讲解(必看篇)
2017/07/04 Javascript
解决vue2.0动态绑定图片src属性值初始化时报错的问题
2018/03/14 Javascript
Angular6中使用Swiper的方法示例
2018/07/09 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
2018/10/01 Javascript
微信小程序websocket实现即时聊天功能
2019/05/21 Javascript
javascript的惯性运动实现代码实例
2019/09/07 Javascript
JavaScript实现动态生成表格
2020/08/02 Javascript
vue中h5端打开app(判断是安卓还是苹果)
2021/02/26 Vue.js
python实现猜单词小游戏
2020/05/22 Python
python ipset管理 增删白名单的方法
2019/01/14 Python
对django layer弹窗组件的使用详解
2019/08/31 Python
python文件编写好后如何实践
2020/07/07 Python
python opencv角点检测连线功能的实现代码
2020/11/24 Python
html5各种页面切换效果和模态对话框用法总结
2014/12/15 HTML / CSS
美国最受欢迎的度假目的地优惠套餐:BookVIP
2018/09/27 全球购物
总经理办公室主任岗位职责
2013/11/12 职场文书
校园网站的创业计划书范文
2013/12/30 职场文书
我的梦想演讲稿
2014/04/30 职场文书
2015教师个人年度工作总结
2015/10/23 职场文书
聊聊golang中多个defer的执行顺序
2021/05/08 Golang
Redis特殊数据类型bitmap位图
2022/06/01 Redis
Spring boot admin 服务监控利器详解
2022/08/05 Java/Android