从头认识java-13.5 利用泛型构建复杂模型
这一章节我们来展示一下如何利用泛型构建复杂模型?
1.元组列表
我们之前已经说过元组是一个复杂的模型,能够返回多对象。
package com.ray.ch11;
import java.util.ArrayList;
public class Test {
public ArrayList<Tuple<A, B, C>> test() {
ArrayList<Tuple<A, B, C>> list = new ArrayList<Tuple<A, B, C>>();
for (int i = 0; i < 10; i++) {
list.add(new Tuple<A, B, C>(new A(), new B(), new C()));
}
return list;
}
public static void main(String[] args) {
new Test().test();
}
}
class A {
}
class B {
}
class C {
}
@SuppressWarnings("hiding")
class Tuple<A, B, C> {
public final A a;
public final B b;
public final C c;
public Tuple(A a, B b, C c) {
this.a = a;
this.b = b;
this.c = c;
}
}
上面的代码我们通过元组来实现一个比較复杂的模型。
我们以下再引用另外一个样例。一个商店。
2.商店
这个商店由办公区、前台、销售区组成,并且销售区由若干货架组成,货架上面又须要放置多种货物。
package com.ray.ch11; import java.util.ArrayList;
import java.util.Collection;
import java.util.Random; public class Store extends ArrayList<SaleZone> {
private Office office = new Office();
private CheckOut checkOut = new CheckOut(); public Store(int saleZoneNum, int shelfNum, int produceNum) {
for (int i = 0; i < saleZoneNum; i++) {
add(new SaleZone(shelfNum, produceNum));
}
} public static void main(String[] args) {
new Store(1, 2, 5);
}
} class Product {
private int id = 0;
private String name = "";
private double price = 0.0; public Product(int id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
System.out.println(toString());
} public static Generator<Product> generator = new Generator<Product>() {
@Override
public Product next() {
Random random = new Random();
int id = random.nextInt();
return new Product(id, "test-" + id, random.nextDouble());
}
}; @Override
public String toString() {
return "produce id: " + id + " name: " + name + " price: " + price;
}
} interface Generator<T> {
public T next();
} class Generators {
public static <T> Collection<T> fill(Collection<T> collection,
Generator<T> generator, int num) {
for (int i = 0; i < num; i++) {
collection.add(generator.next());
}
return collection;
}
} class Shelf extends ArrayList<Product> {
/**
*
*/
private static final long serialVersionUID = 1L; public Shelf(int produceNum) {
Generators.fill(this, Product.generator, produceNum);
}
} class SaleZone extends ArrayList<Shelf> {
/**
*
*/
private static final long serialVersionUID = 1L; public SaleZone(int shelfNum, int produceNum) {
for (int i = 0; i < shelfNum; i++) {
add(new Shelf(produceNum));
}
}
} class Office {
} class CheckOut {
}
大家可能理解上面的代码会比較复杂一点,我解释一下:
1.第一个难度在于生成器,假设读了前面章节或许会简单一点。
事实上这里使用生成器,主要是为了抽象出一个比較通用的生成器。假设是一般的代码,我们能够在product里面直接返回一个produceList,这种代码看上去或许会好非常多。
2.Generators,主要是抽象出往容器填充数据的通用性代码。
3.里面有几个类都直接继承了ArrayList,这里是为了在构造器的时候就能够直接调用add方法,不用在构造一次ArrayList。假设依照寻常的习惯,或许我们会自己建立一个ArrayList,然后往里面填充数据就算了
4.使用匿名内部类在product里面创建生成器。
总结:这一章节主要是展示一下如何利用泛型构建复杂模型。
这一章节就到这里,谢谢。
-----------------------------------
从头认识java-13.5 利用泛型构建复杂模型的更多相关文章
- 利用Python构建时间序列模型解决实际问题的正确姿势
要本着应用到实际工作中目的去学时间序列分析,才能深入浅出的学会,不要纠结于理论,只听我的,我有信心说明白. 本章内容 趋势分析 序列分解 序列预测 序列分解 统计学基础铺垫 划分 时间序列按照季节性划 ...
- Java学习笔记之使用反射+泛型构建通用DAO
PS:最近简单的学了学后台Servlet+JSP.也就只能学到这里了.没那么多精力去学SSH了,毕竟Android还有很多东西都没学完.. 学习内容: 1.如何使用反射+泛型构建通用DAO. 1.使用 ...
- 利用泛型抽取Dao层,加事务注解问题(java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType)
想利用泛型抽取BaseDao层,简化操作时出现故障: @Transactional这个注解是能够继承的.于是就想写在抽取的BaseDao层上,让实现的类能够不用写@Transactional,就可开启 ...
- 利用Dockerfile构建一个基于centos 7,包括java 8, tomcat 7,php ,mysql+mycat的镜像
Dockerfile内容如下: FROM centos MAINTAINER Victor ivictor@foxmail.com WORKDIR /root RUN rm -f /etc/yum.r ...
- 《徐徐道来话Java》(2):泛型和数组,以及Java是如何实现泛型的
数组和泛型容器有什么区别 要区分数组和泛型容器的功能,这里先要理解三个概念:协变性(covariance).逆变性(contravariance)和无关性(invariant). 若类A是类B的子类, ...
- JAVA提高六:泛型
在面向对象编程语言中,多态算是一种泛化机制.例如,你可以将方法的参数类型设置为基类,那么该方法就可以接受从这个基类中导出的任何类作为参数,这样的方法将会更具有通用性.此外,如果将方法参数声明为接口,将 ...
- [Gradle] 在 Eclipse 下利用 gradle 构建系统
转载自:http://www.ibm.com/developerworks/cn/opensource/os-cn-gradle/ 构建系统时候常常要用到 Ant, Maven 等工具,对于初学者 ...
- Java Collections API和泛型
Java Collections API和泛型 数据结构和算法 学会一门编程语言,你可以写出一些可以工作的代码用计算机来解决一些问题,然而想要优雅而高效的解决问题,就要学习数据结构和算法了.当然对数据 ...
- springboot利用swagger构建api文档
前言 Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件.本文简单介绍了在项目中集成swagger的方法和一些常见问题.如果想深入分析项目源码,了解更多内容,见参考资料. S ...
随机推荐
- TF-IDF算法--关键词句和文本集中每篇文章相关度计算
关键词句和文本集每篇文章相关度计算:假设语料库中有几万篇文章,每篇文章的长度不一,你任意输入关键词或句子,通过代码以tf-idf值为准检索出来相似度高的文章. 1.TF-IDF概述 TF-IDF是一种 ...
- 排序系列 之 希尔排序算法 —— Java实现
基本思想: 希尔排序的实质就是分组插入排序,又称缩小增量法. 将整个无序序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本 ...
- thrift RPC 框架的自我搭建
安装thrift rpc 安装的系统是Centos 7 未成功的方法 :(原因没找到,但是还是要记录下) 安装依赖库 yum install automake libtool flex bison ...
- A - George and Accommodation
Problem description George has recently entered the BSUCP (Berland State University for Cool Program ...
- (转载)更新到Retrofit2的一些技巧
更新到Retrofit2的一些技巧 作者 小武站台 关注 2016.02.22 22:13* 字数 1348 阅读 1621评论 0喜欢 5赞赏 1 原文链接:Tips on updating to ...
- python爬虫:爬取易迅网价格信息,并写入Mysql数据库
本程序涉及以下方面知识: 1.python链接mysql数据库:http://www.cnblogs.com/miranda-tang/p/5523431.html 2.爬取中文网站以及各种乱码处 ...
- windows server 2008 R2开机进度条闪过后黑屏
起因:想在2008中添加hyper-v角色 事件经过: 1.在服务器管理器中添加hyper-v角色,重启,一直配置失败. 2.在bios开启vt-x,重新添加hyper-v角色,重启,进度条闪一下之后 ...
- adb使用实践
目录 1. adb 端口占用 2. 查看包名和MainAcitivity =============================================================== ...
- swift可选值总结
1.枚举结构: 2.装包.解包概念:关联值. 3.可选值声明: 4.解包: 5.可选值作为参量生成的链. 6.可选值调用链. 最后做个总结 访问可选对象的属性或方法时,可以用 ? 号 访问可选对象的属 ...
- Here comes Treble: A modular base for Android
On the Android team, we view each dessert release as an opportunity to make Android better for our u ...