从头认识java-13.5 利用泛型构建复杂模型

本文通过两个实例展示了如何运用泛型构建复杂的模型。首先介绍了如何使用元组列表来实现多对象返回的复杂模型。其次,详细说明了一个包含办公区、前台及销售区域的商店模型设计过程,涉及货架和商品的组织方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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


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


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

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

目录




### 回答1: jmu-java-05集合()-10-generalstack是关于Java中的通用栈的学习内容。通用栈是一种可以存储任意类数据的栈结构,通过的方式实现。在学习中,我们可以了解到通用栈的实现原理、使用方法以及注意事项等内容,帮助我们更好地理解和应用Java。 ### 回答2: JMU-Java-05集合()-10-GeneralStack是一个Stack(栈)的实现类,使用Java中的进行定义,可以存储任何类的数据。 在该类中,使用一个Object类的数组进行存储元素,并通过一个整变量top来表示当前栈顶元素的下标。在push(入栈)方法中,先将top加一,然后将元素存储在数组中,实现了入栈的功能。在pop(出栈)方法中,先判断栈是否为空,若为空则抛出栈空异常,否则将top减一,并返回数组中相应的元素,实现了出栈的功能。其他方法如isEmpty(判断栈是否为空)、isFull(判断栈是否已满)和size(获取栈中元素个数)也在该类中实现。 该类的定义使得我们可以使用该类存储任何类的数据,而不需要在定义类时指定数据类,提高了其灵活性和可复用性。在使用时,我们只需要在创建对象时传入相应的数据类,如:GeneralStack<Integer> stack = new GeneralStack<Integer>();即可。 该类还实现了Iterable接口,使得该类可以使用foreach循环进行遍历操作,方便了我们对栈中元素的操作。同时,该类还通过对数组的动态扩容,解决了数组固定大小的限制问题,从而提高了该栈类的通用性和易用性。 总之,JMU-Java-05集合()-10-GeneralStack是一个使用实现的通用栈类,可以存储各种类的数据,并提供了常用的栈操作方法,具有较高的可复用性与适用性。 ### 回答3: jmu-java-05集合()-10-generalstack,意为基于的栈实现。 首先我们需要了解什么是Java SE 5引入的一个新特性,它可以让我们在编写代码时定义一些未知的类参数,以达到代码的复用和类安全的目的。对于集合类或者其他容器类而言,适用于任何类的容器的需求是普遍存在的,这时就可以应用。 在Java使用<>标识,其语法格式如下: ```java public class 类名<类参数列表> { //成员变量、方法等 } ``` 类参数列表是由逗号隔开的参数列表,可以理解为未知类的占位符。这样的好处是可以在编写集合类时,避免出现类转换等一系列问题,提高程序的可读性。 而在jmu-java-05集合()-10-generalstack中,则是基于实现的数据结构——栈。栈是一种后进先出(LIFO)的数据结构,它只允许在栈顶添加或删除元素,因此操作非常简单、快速并且高效。 在该实现中,栈的元素可以是任意类,数据元素入栈则是通过 push() 方法实现的,出栈则是通过 pop() 方法实现的。其中,push() 方法用于向栈中添加新的元素,pop() 方法用于弹出并返回栈顶的元素。同时,还提供了 isEmpty() 方法、size() 方法等基本的栈操作方法。 总之,jmu-java-05集合()-10-generalstack是一种基于实现的栈,提供了复用和类安全的目的。其实现使用简便、高效、易于扩展等优点,广应用在Java开发中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值