在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中metaclass元类的创建与使用
Jun 30 Python
win系统下为Python3.5安装flask-mongoengine 库
Dec 20 Python
Django 路由控制的实现代码
Nov 08 Python
对python打乱数据集中X,y标签对的方法详解
Dec 14 Python
python word转pdf代码实例
Aug 16 Python
Python 单例设计模式用法实例分析
Sep 23 Python
python3 pillow模块实现简单验证码
Oct 31 Python
小 200 行 Python 代码制作一个换脸程序
May 12 Python
python实现一次性封装多条sql语句(begin end)
Jun 06 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
Jun 30 Python
用于ETL的Python数据转换工具详解
Jul 21 Python
如何用python免费看美剧
Aug 11 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
分享一个Laravel好用的Cache宏
2015/03/02 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
PHP微信支付实例解析
2016/07/22 PHP
PHP实现微信商户支付企业付款到零钱功能
2018/09/30 PHP
张孝祥JavaScript学习阶段性总结(2)--(X)HTML学习
2007/02/03 Javascript
JS 获取滚动条高度示例代码
2013/10/24 Javascript
node.js中的http.response.end方法使用说明
2014/12/14 Javascript
JavaScript正则表达式之multiline属性的应用
2015/06/16 Javascript
基于Javascript实现弹出页面效果
2016/01/01 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
2016/01/29 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
2016/06/30 Javascript
基于JS实现的随机数字抽签实例
2016/12/08 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
2017/01/04 Javascript
jquery中each循环的简单回滚操作
2017/05/05 jQuery
vue中子组件的methods中获取到props中的值方法
2018/08/27 Javascript
JavaScript解析及序列化JSON的方法实例分析
2019/01/04 Javascript
react koa rematch 如何打造一套服务端渲染架子
2019/06/26 Javascript
Python中list循环遍历删除数据的正确方法
2019/09/02 Python
wxPython电子表格功能wx.grid实例教程
2019/11/19 Python
Django中密码的加密、验密、解密操作
2019/12/19 Python
Python计算公交发车时间的完整代码
2020/02/12 Python
Pygame框架实现飞机大战
2020/08/07 Python
Pycharm的Available Packages为空的解决方法
2020/09/18 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
利用CSS3的3D效果制作正方体
2020/03/10 HTML / CSS
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
Hunkemöller西班牙:欧洲最大的内衣连锁店
2018/08/15 全球购物
官方授权图形T恤和服装:Fifth Sun
2019/06/12 全球购物
文明风采获奖感言
2014/02/18 职场文书
中医学专业自荐信范文
2014/04/01 职场文书
法律专业求职信
2014/05/24 职场文书
艺术学院毕业生自荐信
2014/07/05 职场文书
领导干部学习“三严三实”思想汇报
2014/09/15 职场文书
2015年大学宣传部工作总结
2015/05/26 职场文书
教师法制教育培训学习心得体会
2016/01/14 职场文书
初中语文教学反思范文
2016/03/03 职场文书