如何使用java代码生成_使用Java成功生成代码的7个技巧

如何使用java代码生成

作为介绍,最近我有点安静,部分原因是我一直在忙于Chronicle-FIX的工作 。 这是Chronicle-Enterprise套件中的一个新的超低延迟库,我们证明了该库可以在低个位数微秒内解析和存储消息。 当然,它利用了我们的开源产品Chronicle-Queue , Chronicle-Network和Chronicle-Bytes 。

我们实现的低延迟的秘密之一是,每个实现都可以完全基于其所需的架构来生成自定义的修复引擎。 为了实现这一点,我构建了很多代码生成代码。

因此,我想我将分享在此过程中学到的一些经验教训。

1.使用代码生成库

到目前为止,这是最重要的提示。 我很难强调这有多重要,以及您将节省多少时间和复杂性。 您真的不想在创建字符串文字时试图弄乱代码中的正确间距或加倍和三倍转义的引号引起麻烦!

我使用了JavaPoet ,它是开源的(Apache 2),非常好。 它处理了我想做的所有事情,包括一些非常复杂的泛型。 它唯一不支持的事情就是声明静态导入,但这很容易解决,对于一个优秀的库来说,它并不重要。

JavaPoet将Java代码分解为对象:TypeSpec(类或接口),MethodSpec(方法),FieldSpec(字段),CodeBlocks(代码块)。 它巧妙地为基于printf模式的语句(代码行)提供了丰富的语法。 您会发现,遵循这种范式将使您拥有更简洁,更简洁的代码,而不是自己动手编写代码,这很容易使这类问题的过程编码路线更加混乱。

2.首先手动编写代码

在没有先编写示例代码的情况下,请勿尝试和生成代码。 通过后视镜进行编码不是一件容易的事,如果您在进行过程中对其进行处理,则变得很复杂。

首先花一点时间手工编写代码,然后为其生成代码。

另外,您将希望产生尽可能最佳的代码,这只有在您首先花费时间和精力手工编写代码的情况下才能完成。

3.生成尽可能少的代码

仅生成所需数量的代码。 因此,例如,如果所有生成的类都需要实现某个方法,请使用可以由生成的代码调用的帮助程序类,而不是多次生成该方法。 或者,获取您的代码以使用基类上的方法扩展静态基类。

4.确保可以一次性吹走所有生成的代码

不要将静态代码与生成的代码混合使用。 您要做的是拥有com.test.generatedcode.xx.xx类的软件包。 在每次测试/开发运行结束时,您都应该能够删除整个文件夹com/test/generatedcode ,这意味着该文件夹中根本没有静态代码。

您会发现以这种方式安排代码将使测试周期变得更快。

5.从少量可验证的代码开始

代码生成的重点通常是产生大量代码。 很难测试您生成的代码是否正确。 因此,从一个小而复杂的示例开始,您可以通过阅读代码进行检查,并为其提供测试用例。

希望以后的情况会更多。

6.生成测试用例

如第5点所述,很难在所有情况下验证您的代码生成器是否正确。 因此,您应该尝试将测试用例作为所生成代码的一部分进行生成。 然后,您可以从生成器生成许多偏斜的复杂代码,并对其进行测试。

7.冗长

从本质上讲,生成代码的代码可能很难阅读和理解。 代码生成代码永远不必太快,因此不必担心使其变得冗长。 使用大量评论,但更重要的是,尝试使其尽可能明确,以便您可以在一年内回顾它并仍然可以对其进行维护。

翻译自: https://www.javacodegeeks.com/2015/12/7-tips-successful-code-generation-java.html

如何使用java代码生成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多核 linux 绑定,Linux 操作系统下CPU多核心的绑定

现在多CPU的趋势越来越大了. 有时候为了更好地操作机器, 需要将某个进程绑定到具体的CPU上去. 下面给出了一个进程绑定到具体的CPU上去的一个例子.cpu.c[CODE]#include#include#include#include#include#define __USE_GNU#include#include#includeint main(int argc, char* arg…

java键盘事件键值表_Java的20年:重大事件的时间表

java键盘事件键值表翻译自: https://www.javacodegeeks.com/2015/12/2-decades-java-timeline-notable-events.htmljava键盘事件键值表

c语言printf到指定文件,急求如何将下列C语言程序数据存储到文件中?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼求如何改动才能将下列程序的存储输入或输出数据(或两者一起)到指定的文件(或运行时直接创立一个文件)如Arrangement中。#include int n0;int rest[7][7]; //全局声明,以供全局调用int main(){void perm(int list[],int ,int );int …

spring一站式开发_Spring开发人员知道的一件事

spring一站式开发在最近的(核心)Spring框架培训课程中,有人问我:“(Java)Spring开发人员应该知道的一件事是什么?” 这个问题使我措手不及。 是的,(核心)Spri…

c语言十六进制转换加H,c语言十六进制和十进制间的转换.docx

集团文件版本号:(M928-T898-M248-WU2669-I2896-DQ586-M1988)集团文件版本号:(M928-T898-M248-WU2669-I2896-DQ586-M1988)c语言十六进制和十进制间的转换1.将十六进制转换为十进制.#include#includeint main(void){int convert(int,char *);int i,j;char …

jax-ws和jax-rs_带有JAX-WS和Spring的Web服务应用程序

jax-ws和jax-rs1.简介 这是一个漫长的等待,但是我最终要发布有关使用Spring创建第一个基于SOAP的Web服务应用程序的教程。 JAX-WS (用于XML Web服务的Java API)是用于以XML格式创建Web服务的一组API,我们最常将其称为基于SOAP的We…

c command语言学例子,语言学第四章

《语言学第四章》由会员分享,可在线阅读,更多相关《语言学第四章(3页珍藏版)》请在人人文库网上搜索。1、Chapter 4:SyntaxI. Decide whether each of the following statements is True or False:1. Syntax is a subfield of linguistics that studies …

eclipse开发jsf_在Eclipse上创建JSF / CDI Maven项目

eclipse开发jsf当我在研究JSF和CDI示例时,我认为提到创建JSF和CDI Maven项目所需的步骤会很有用。 您可以找到以下步骤。 工具类 默认情况下,M2E插件随附的Eclipse Luna。 因此,无需自己安装插件。 WildFlye8.x。 从主菜单中选择文件->…

apache camel_Apache Camel的性能调整思路

apache camel时不时地,我会以Camel速度较慢的观点来询问有关优化Camel应用程序的问题。 骆驼只是连接不同系统的粘合剂,路由引擎全部在内存中,并且不需要任何持久状态。 因此,在99%的情况下,性能问题是由于…

为什么写C语言弹不出窗口,居然还有SB说C写不出窗口的..

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼decebx.endwassumeesi:nothinginvokeGetStockObject,WHITE_BRUSHinvokeSelectObject,hDcBack,eaxinvokeDeleteObject,eaxinvokeDeleteObject,hBmpBackpopadret_CreateBackGroundendp;>>>>>>>>>>>…

java写入单个字符_将2个字符写入单个Java char

java写入单个字符这是创建超低延迟的Chronicle FIX-Engine时使用的另一个好技巧。 在从字节流中读取数据时,如果可能的话,将数据存储在char而不是将其读取到String效率更高。 (至少您要避免创建String对象,尽管可以通过使用缓存或…

xmanager linux,教您用xmanager启动Linux上的图形界面程序-Go语言中文社区

对于习惯实体化的开发人员来说,还是界面化用着比较习惯,所以这就涉及到掌握使用Xmanager启动Linux上的图形界面程序,为了方便大家的使用,本集小编就详细的为大家讲解具体操作。具体步骤如下:1、首先下载Xmanager并安装…

android开发 文件分享到应用,Android 实现文件分享功能(共享多个文件)

效果如图:神一样的代码:针对image代码如下:IntentsharenewIntent(Intent.ACTION_SEND);share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));//此处一定要用Uri.fromFile(file),其中file为File类型,否则附件无法发送成功。s…

python kotlin_用Java和Python模仿Kotlin构建器

python kotlin介绍 Kotlin可能现在是我最喜欢的语言,可能它提供的最酷的功能之一是基于几个功能构建的类型安全的生成器(稍后解释)。 我发现自己真的很想在其他两种主要语言(Java和Python)中使用此功能。 本文解释了我…

android 4.4.2截屏方法,android4.4.2 使用 uiautoviewer 截屏报错

1、正常启动后,使用 uiautomatorviewer 没有问题2、由于要使用 uiautomator,每次启动 uiautomator 服务后再使用 uiautomatorviewer 就会图片错误,启动 uiautomator 服务的步骤如下:1、Download jar files from uiautomator jsonr…

java fastutil_具有FastUtil的精简Java集合

java fastutil针对我最近在GNU Trove库上发表的《 发现Java原始资源集合的处理 》一书 , TheAlchemist指出了fastutil优于trove的一些优点:“我更喜欢fastutil( http://fastutil.di.unimi.it/ ),因为它仍在积极开发中&…

android 圆角按钮渐变,Android实现圆形渐变加载进度条

最近设计要求要一个圆形进度条渐变的需求:1.画圆形进度条2.解决渐变最终实现效果代码package com.view;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.grap…

javaone_JavaOne 2015:为JDK 9做准备– blog @ CodeFX

javaoneJavaOne 2015看到了Project Jigsaw团队关于Java 9中的模块化的一系列讨论 。它们都是非常有趣的,并且充满了宝贵的信息,我敦促每个Java开发人员都注意它们。 除此之外,我想给社区一种搜索和引用它们的方法,因此我在这里总…

android wifi 通讯录,通过wifi和gmail从symbian手机中将名片夹(通讯录)导入到android手机 | 古意人...

使用背景与条件:最近入手了android手机defy,机器到手后兴奋过度,马上将原symbian手机诺基亚E50的sim卡和内存卡都转移到了defy上,捣鼓了一段时间的defy,突然想起要同步原诺基亚手机的名片夹到defy中(android中貌似称为…

oracle aq_通过Java 8流使用Oracle AQ

oracle aqOracle数据库最令人敬畏的功能之一是Oracle AQ:Oracle数据库高级队列 。 AQ API直接在数据库中实现了完整的事务性消息传递系统。 在数据库处于系统中心的经典体系结构中,使用AQ进行进程间通信时,多个应用程序(其中一些…