这一章节我们来展示一下如何利用泛型构建复杂模型?

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 利用泛型构建复杂模型的更多相关文章

  1. 利用Python构建时间序列模型解决实际问题的正确姿势

    要本着应用到实际工作中目的去学时间序列分析,才能深入浅出的学会,不要纠结于理论,只听我的,我有信心说明白. 本章内容 趋势分析 序列分解 序列预测 序列分解 统计学基础铺垫 划分 时间序列按照季节性划 ...

  2. Java学习笔记之使用反射+泛型构建通用DAO

    PS:最近简单的学了学后台Servlet+JSP.也就只能学到这里了.没那么多精力去学SSH了,毕竟Android还有很多东西都没学完.. 学习内容: 1.如何使用反射+泛型构建通用DAO. 1.使用 ...

  3. 利用泛型抽取Dao层,加事务注解问题(java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType)

    想利用泛型抽取BaseDao层,简化操作时出现故障: @Transactional这个注解是能够继承的.于是就想写在抽取的BaseDao层上,让实现的类能够不用写@Transactional,就可开启 ...

  4. 利用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 ...

  5. 《徐徐道来话Java》(2):泛型和数组,以及Java是如何实现泛型的

    数组和泛型容器有什么区别 要区分数组和泛型容器的功能,这里先要理解三个概念:协变性(covariance).逆变性(contravariance)和无关性(invariant). 若类A是类B的子类, ...

  6. JAVA提高六:泛型

    在面向对象编程语言中,多态算是一种泛化机制.例如,你可以将方法的参数类型设置为基类,那么该方法就可以接受从这个基类中导出的任何类作为参数,这样的方法将会更具有通用性.此外,如果将方法参数声明为接口,将 ...

  7. [Gradle] 在 Eclipse 下利用 gradle 构建系统

      转载自:http://www.ibm.com/developerworks/cn/opensource/os-cn-gradle/ 构建系统时候常常要用到 Ant, Maven 等工具,对于初学者 ...

  8. Java Collections API和泛型

    Java Collections API和泛型 数据结构和算法 学会一门编程语言,你可以写出一些可以工作的代码用计算机来解决一些问题,然而想要优雅而高效的解决问题,就要学习数据结构和算法了.当然对数据 ...

  9. springboot利用swagger构建api文档

    前言 Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件.本文简单介绍了在项目中集成swagger的方法和一些常见问题.如果想深入分析项目源码,了解更多内容,见参考资料. S ...

随机推荐

  1. TF-IDF算法--关键词句和文本集中每篇文章相关度计算

    关键词句和文本集每篇文章相关度计算:假设语料库中有几万篇文章,每篇文章的长度不一,你任意输入关键词或句子,通过代码以tf-idf值为准检索出来相似度高的文章. 1.TF-IDF概述 TF-IDF是一种 ...

  2. 排序系列 之 希尔排序算法 —— Java实现

    基本思想: 希尔排序的实质就是分组插入排序,又称缩小增量法. 将整个无序序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本 ...

  3. thrift RPC 框架的自我搭建

    安装thrift rpc   安装的系统是Centos 7 未成功的方法 :(原因没找到,但是还是要记录下) 安装依赖库 yum install automake libtool flex bison ...

  4. A - George and Accommodation

    Problem description George has recently entered the BSUCP (Berland State University for Cool Program ...

  5. (转载)更新到Retrofit2的一些技巧

    更新到Retrofit2的一些技巧 作者 小武站台 关注 2016.02.22 22:13* 字数 1348 阅读 1621评论 0喜欢 5赞赏 1 原文链接:Tips on updating to ...

  6. python爬虫:爬取易迅网价格信息,并写入Mysql数据库

    本程序涉及以下方面知识: 1.python链接mysql数据库:http://www.cnblogs.com/miranda-tang/p/5523431.html   2.爬取中文网站以及各种乱码处 ...

  7. windows server 2008 R2开机进度条闪过后黑屏

    起因:想在2008中添加hyper-v角色 事件经过: 1.在服务器管理器中添加hyper-v角色,重启,一直配置失败. 2.在bios开启vt-x,重新添加hyper-v角色,重启,进度条闪一下之后 ...

  8. adb使用实践

    目录 1. adb 端口占用 2. 查看包名和MainAcitivity =============================================================== ...

  9. swift可选值总结

    1.枚举结构: 2.装包.解包概念:关联值. 3.可选值声明: 4.解包: 5.可选值作为参量生成的链. 6.可选值调用链. 最后做个总结 访问可选对象的属性或方法时,可以用 ? 号 访问可选对象的属 ...

  10. 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 ...