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

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. MongoDB如何实现读写分离

    MongoDB如何实现读写分离 MongoDB复制集(Replica Set)通过存储多份数据副本来保证数据的高可靠,通过自动的主备切换机制来保证服务的高可用.但需要注意的时,连接副本集的姿势如果不对 ...

  2. js获取验证码 秒表效果(原创)

    <script src="http://code.jquery.com/jquery-latest.js"></script> <input type ...

  3. Mysql慢查询和慢查询日志分析利器&ndash;mysqlsla

    1.安装mysqlsla Source code     wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz tar zvxf mysqlsl ...

  4. [MVC.NET] Asp.Net MVC3 简单入门第一季

    转自:http://www.cnblogs.com/fly_dragon/archive/2011/10/12/2208042.html 初识Asp.Net MVC2.0 初识Asp.Net MVC2 ...

  5. 第6章 服务模式 在 .NET 中实现 Service Interface

    上下文 您 的应用程序部署在 Microsoft Windows? 操作系统上.您决定将应用程序的某一块功能作为 ASP.NET Web Service 公开.互操作性是一个关键问题,因此您无法使用仅 ...

  6. nodejs -- crypto MD5签名

    MD5使用方法: const crypto = require('crypto'); var obj = crypto.createHash('md5'); // 可多次调用 update obj.u ...

  7. Python 之 基础知识(四)

    一.公共方法(列表.元组.字典以及字符串) 1.内置函数 cmp函数取消可以用比较运算符来代替,但是字典是无序的,故而不可以用比较运算符比较. 2.切片(列表.元组.字符串适用) 3.运算符 列表中直 ...

  8. JAVA代理方式使用示例总结

    JAVA代理方式使用示例总结 一.    代理方式概括 Java的代理方式主要包含了静态代理,动态代理两种方式,其中,动态代理根据实现的方式不同,又可以划分为jdk动态代理和cglib动态代理. 二. ...

  9. FAQ: SBS 2011. The Windows SBS Manager service terminated unexpectedly

    Symptoms The Windows SBS Manager service is stopped with EventID 7034 every half an hour on SBS 2011 ...

  10. PythonGIS可视化—Matplot basemap工具箱

    原文链接:http://www.douban.com/group/topic/32821988/ 原文链接:http://www.cnblogs.com/vamei/archive/2012/09/1 ...