前提

某天晚上老夫在神游时,想起白天公司同事说起的问题,这老表抱怨使用mysql生成大批的随机测试数据太过麻烦,问大家有没有好的工具推荐,老夫对这种事情当然不关心,毕竟我也不知道。

秉承着不懂就要问,不会就要学的核心思想,花了点喝咖啡的时间,简单的在脑海中构思了一下工具核心实现,决定开始动手写,今晚的烧烤不吃了。

几个问题

我们需要学会如何去分析一个需求,在不包含业务的情况下,尽可能多的考虑即将面临的问题以及解决方式。

1.如何生成数据。

2.如何把数据放在对象里。

3.如何输出对应类型的对象,确保使用者不用再次转换。

4.如何约束生成规则,让生成的数据尽量的具有实际意义。

5.对于不同的类型,如何判断。

6.对于List,Map此类数据如何生成。

7.有点饿。

解决问题的路

粗略的预设了以上7点拦路虎,除了第7点暂时无法解决外,另外6点都好说,好说。

把以上问题都一步步解决,整个工具也已经大概成型。

第一个问题:如何生成数据

在不要求实际业务意义的情况下,要解决此问题,似乎格外的简单,我们在日常业务中会接触到一些简单的数据生成器,如 new Random().nextInt() 等, 我们需要做的只是对生成的数据的范围进行一个限制,其他类型的数据也具有解决方案,后续会一一说明。

第二个问题:如何把数据放在对象里

没有其他办法,使用反射进行设置。

第三个问题:如何输出对应类型

使用过一些工具,唯一蛋疼的地方就在最后一步,需要我进行一次强制转换才能正常使用,如:MyEntity myEntity = (MyEntity) xxx.xxx(MyEntity.class); ,此方式从功能上来说肯定没有任何问题,从我个人角度来说,老夫并不是很喜欢这种编码风格。

于是老夫思来想去,最终皇天不负有心人,方案如下(伪代码):

public class ClassName<T>{
public T build(Class clazz){
Object data; //生成的数据
//.......
return (T)data;
}
}

使用泛型的方式,解决了此问题,对此部分不熟悉的同僚,请查阅相关资料,此处不做赘述。

第四个问题:如何约束生成规则,让生成的数据尽量的具有实际意义。

此问题的解决方案其实很多,注解,配置,代码设置,都可实现,我们需要考虑的是几种方案的优劣。

注解先排除,工具性质的框架,个人觉得应该最大化的避免代码的侵入性,注解会对使用者项目的实体类进行代码入侵。

剩下2种方式最终我选择配置文件的方式,代码设置固然可行,但是会导致整个工具使用起来相当复杂,且工具的设计者也需要考虑更多。

第五个问题:对于不同的类型,如何判断

此问题作为数据生成类的工具额外重要,对需要生成的类型的判断也是基础中的基础,但是却格外的简单,方式如下(伪代码):

public Object checkType(Type fieldType){
if(fieldType == int.class || fieldType == Integer.class){
//...
} else if(fieldType == String.class){
//...
}
}

Type为java.lang.reflect包下的类,表示Java中属性的类型,使用此方式,可判断出对应的需要生成的数据类型,此处有坑,后续说明。

第六个问题:对于List,Map此类数据如何生成

此处文字不好说明。后续代码部分进行说明

开始Codeing

粗略的分析并且简单的构思了一下几只拦路虎的对付方法,下面可以准备开始剥夺键盘的寿命了。

当然还有一个很严重的问题:给你的工具起个名字吧。

本例的名称暂定为JavaFastData。

既然是工具,那么需要先提供一个对外的API,供使用者调用。

代码部分篇幅略大,为了不影响各位的体验,随后另开文章,精彩继续。

如何从0到1的构建一款Java数据生成器-第一章的更多相关文章

  1. 如何从0到1的构建一款Java数据生成器-第二章

    前提 在上一章我们提到了并且解决了几只拦路虎,承上启下,下面我们一起来实现一款数据生成器. 对外API /** * @description: 本地数据生成API * @author: peter * ...

  2. 面向 Java 开发人员的 Ajax: 构建动态的 Java 应用程序

    面向 Java 开发人员的 Ajax: 构建动态的 Java 应用程序 Ajax 为更好的 Web 应用程序铺平了道路 在 Web 应用程序开发中,页面重载循环是最大的一个使用障碍,对于 Java™ ...

  3. 三、使用Maven构建简单的java项目

    前边,我刚搭建了Maven环境,还有给大家推荐了学习资源,这个小节,我们来就来,,简单的玩玩maven. 1.所需工具: 1.Eclipse     2.apache-maven-3.3.9   3. ...

  4. Ant构建与部署Java项目---入门

    原文地址:http://tech.it168.com/j/2007-11-09/200711091344781.shtml Ant是一个Apache基金会下的跨平台的构件工具,它可以实现项目的自动构建 ...

  5. 【原创】构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化措施

    原文:[原创]构建高性能ASP.NET站点 第六章-性能瓶颈诊断与初步调优(下前篇)-简单的优化措施 构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化措施 前言:本篇 ...

  6. 【原创】构建高性能ASP.NET站点 第七章 如何解决内存的问题(前中篇)—托管资源优化—监测CLR性能

    原文:[原创]构建高性能ASP.NET站点 第七章 如何解决内存的问题(前中篇)-托管资源优化-监测CLR性能 构建高性能ASP.NET站点 第七章 如何解决内存的问题(前中篇)—托管资源优化—监测C ...

  7. Gradle入门(3):构建第一个Java项目

    Gradle插件通过引入特定领域的约定和任务来构建你的项目.Java插件是Gradle自身装载的一个插件.Java插件提供的基本功能远比源代码编译和打包多.它为你的项目建立了一个标准的项目布局,并确保 ...

  8. c++生成算式并计算(《构建之法》第一章课后第一题)

    c++实现计算器(自动生成算式并计算) 要满足的需求有以下几个: 自动生成随机的四则运算算式,包含括号和小数. 对生成的算式计算出结果. 算式.结果分别存储到不同的文件. 一 生成算式 由上述需求可知 ...

  9. Gradle2.0用户指南翻译——第一章. 介绍

    翻译项目请关注Github上的地址:https://github.com/msdx/gradledoc本文翻译所在分支:https://github.com/msdx/gradledoc/tree/2 ...

随机推荐

  1. 20190923-01Linux帮助命令 000 009

    man 获得帮助信息 1. 基本语法 man [命令或配置文件] (功能描述:获得帮助信息) 2.显示说明 表1-6 信息 功能 NAME 命令的名称和单行描述 SYNOPSIS 怎样使用命令 DES ...

  2. 用Python写一个向数据库填充数据的小工具

    一. 背景 公司又要做一个新项目,是一个合作型项目,我们公司出web展示服务,合作伙伴线下提供展示数据. 而且本次项目是数据统计展示为主要功能,并没有研发对应的数据接入接口,所有展示数据源均来自数据库 ...

  3. Java判断一个字符串是否是回文

    package com.spring.test; /** * 判断字符串是否为回文 * * @author liuwenlong * @create 2020-08-31 11:33:04 */ @S ...

  4. python中多进程multiprocessing、多线程threading、线程池threadpool

    浅显点理解:进程就是一个程序,里面的线程就是用来干活的,,,进程大,线程小 一.多线程threading 简单的单线程和多线程运行:一个参数时,后面要加逗号 步骤:for循环,相当于多个线程——t=t ...

  5. 第2课 - 搭建Lua开发环境

    第2课 - 搭建Lua开发环境 1. Lua 的优点 (1)Lua 使用标准的 ANSI C 进行开发,可以无缝集成到宿主程序,且几乎支持所有平台. (2)Lua 是开源且免费的软件,以源码的方式直接 ...

  6. 【深入理解Linux内核架构】6.6 资源分配

    一段摘自<Linux设备驱动程序>的话: 每种外设都通过读写寄存器进行控制.大部分外设都有多个寄存器,不管是内存地址空间还是I/O地址空间,这些寄存器的访问地址都是连续的. 在硬件层,内存 ...

  7. Linux下用户的创建与删除

    我们在Linux下创建用户主要有两种方式:adduser和useradd,它们的区别以及主要用法如下: adduser adduser的用法很简单,只需adduser+username即可,如下: s ...

  8. 手写spring

    体系结构 Spring 有可能成为所有企业应用程序的一站式服务点,然而,Spring 是模块化的,允许你挑选和选择适用于你的模块,不必要把剩余部分也引入.下面的部分对在 Spring 框架中所有可用的 ...

  9. 使用vscode编辑和提交github仓库代码

    写在前面 在github上想删除仓库中的某个文件或文件夹,亦或是重命名操作都很麻烦,这里提供一种vscode的解决方案.在vscode中克隆远程github仓库,然后对代码或文件进行编辑,最后提交即可 ...

  10. Linux实战(13):Centos8 同步时间

    前言 以下操作是通过ntpdate命令实现同步 timedatectl set-timezone Asia/Shanghai # 设置时区 rpm -ivh http://mirrors.wlnmp. ...