从头认识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里面创建生成器。

总结:这一章节主要是展示一下如何利用泛型构建复杂模型。

这一章节就到这里,谢谢。

-----------------------------------

文件夹

时间: 2024-12-27 07:54:53

从头认识java-13.5 利用泛型构建复杂模型的相关文章

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

想利用泛型抽取BaseDao层,简化操作时出现问题: @Transactional这个注解是可以继承的,于是就想写在抽取的BaseDao层上,让实现的类可以不用写@Transactional,就可开启事务. 问题描述: 由于偷懒,没给BaseDao抽接口,代码如下: package com.liang.ssh2.base; import java.lang.reflect.ParameterizedType; import java.util.Collections; import java.u

利用Java反射机制和泛型,全自动解析json

有啦这个简直,太爽啦, 利用Java 反射机制,利用Class 就可以得到 类的 变量  Field[] fields=cls.getDeclaredFields(); 还可以通过类中 的方法名字 去执行这个方法 m1 = cls.getDeclaredMethod(getMothodName(fields[j].getName()), String.class); m1.invoke(result,json.getString(fields[j].getName()) ); 利用泛型 去获取这

利用Dockerfile构建一个基于centos 7,包括java 8, tomcat 7,php ,mysql+mycat的镜像

Dockerfile内容如下: FROM centos MAINTAINER Victor [email protected] WORKDIR /root RUN rm -f /etc/yum.repos.d/* RUN echo '[BASE]' > /etc/yum.repos.d/base.repo RUN echo 'name=base' >> /etc/yum.repos.d/base.repo RUN echo 'baseurl=http://192.168.244.132/

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

转载自:http://www.ibm.com/developerworks/cn/opensource/os-cn-gradle/ 构建系统时候常常要用到 Ant, Maven 等工具,对于初学者来说,它们还是过于复杂,上手还是需要时间的.本文将向读者介绍一种全新的构建项目的方式 gradle,它简单.上手快,能大大节省项目的时间和成本. 在 eclipse 下利用 gradle 构建系统 基本开发环境 操作系统:本教程使用的为 Windows Vista Enterprise, 如果您的系统是

在 Eclipse 下利用 gradle 构建系统

在 eclipse 下利用 gradle 构建系统 基本开发环境 操作系统:本教程使用的为 Windows Vista Enterprise, 如果您的系统是 Linux 的,请选择下载对应版本的其他工具,包括开发工具.Java EE 服务器.Apache Ant.SoapUI. 开发工具:Eclipse IDE for SOA Developers 版本,请到 http://www.eclipse.org/downloads/ 网站下载,当然任何版本的 eclipse 都是可以的. Java

Java基础笔记:泛型

内容:Java中的泛型 优秀文章:新浪博客-海洋星球:http://blog.sina.com.cn/s/blog_44c1e6da0100cus3.html书籍:细说Java.疯狂Java讲义 说明:泛型是于Java SE1.5添加的新特性:泛型的本质是参数化类型,简单来说就是将泛型看作一个或多个参数,使用这个参数的代码片段可以由任何具体类类型的参数来替换:泛型的参数类型只能是类类型,不能是简单类型(简单类型是指不能再简化的编程语言内置数据类型,java中有实数-float-double.整数

【C#】利用反射构建实体

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Reflection; namespace RftToModel { class Program { static void Main(string[] args) { var result = ToModel<TestModel>.GetDelegate_To

[Java]#从头学Java# Java大整数相加

重操旧业,再温Java,写了个大整数相乘先回顾回顾基本知识.算法.效率什么的都没怎么考虑,就纯粹实现功能而已. 先上代码: 1 package com.tacyeh.common; 2 3 public class MyMath { 4 5 public static String BigNumSum(String... n) { 6 int length = n.length; 7 StringBuilder result = new StringBuilder(); 8 //这里判断其实不需

利用OpenSSL构建私有CA

实验环境: CentOS release 6.6(Final)  两台 IP地址: 服务器端:172.16.31.3 客户端:172.16.31.2 查看系统书否已安装openSSL执行命令"rpm –qa openssl" [[email protected] ~]# rpm -qa openssl openssl-1.0.1e-30.el6.x86_64 OpenSSL本身是一种ssl的开源方式用以实现https的数据加密传输,但OpenSSL的功能绝不仅限于此,OpenSSL提供