报告1:分析为何使用Comparable和Number接口
方法类中使用import java.lang.Comparable类和java.lang.Number类,主要因为
数字Long,Btye,Float,Short,Double,Integer继承了Number类,实现了Comparable接口,以下J2SE中UML类图。
图1。0
赋值和取值都使用Comparable和Number类。
(1) 剖析赋值操作。
例子源码如下:
private Number value = null;
public void setValue(final Comparable key, final Number value) {
this.value = value;
}
使用Comparable和Number类,可以使用户输入任意数字类型。
(2) 剖析取值操作。
例子源码如下:
public Number getValue(final Comparable key) {
// 取值操作。。。。。
return this. value;
}
使用Comparable和Number类,可以使用户输入任意数字类型。
(3) 多态取值使用操作。
例子源码如下:
Comparable key = (Comparable) iterator1.next();
Number n = this.dataset.getValue(key);
if (n != null)
double v = n.doubleValue(); // 注意这个地方使用类型转换,实现得向下转型
if (key != null)
String k = key.toString(); // 注意这个地方使用了Object类得转换。
Number最终使用得是double 类型。
Comparable最终使用得是String类型。
小结:以上操作灵活得使用了接口Comparable和抽象类Number,这样操作方便了用户得输入操作,可以适应用户任意输入类型,最后转型由程序完成,从用户角度来看,认为输入任何数字类型,程序都不会出错。从编程角度来看,可以只编写一个Number对象和一个Comparable对象,就可以任意赋值了,不用为了用户输入得类型,而重新定义对象类型,Number对象最终使用得是double 类型Comparable对象最终使用得是String类型,在需要向下转型得时候,直接由多态实现。
报告2:方法参数中使用final关键字
final关键字得使用方法:
对于基本类型的变量,这样做并没有什么实际意义,因为基本类型的变量在调用方法时是传值的,也就是说你可以在方法中更改这个参数变量而不会影响到调用语句,然而对于对象变量,却显得很实用,因为对象变量在传递时是传递其引用,这样你在方法中对对象变量的修改也会影响到调用语句中的对象变量,当你在方法中不需要改变作为参数的对象变量时,明确使用final进行声明,会防止你无意的修改而影响到调用方法。
对不变的data和object reference使用final了让data或object reference成为不变量(常数),请使用final。注意,final仅仅令object reference自身成为不变量,并不限制它所指对象的改变。
在方法参数中,使用final关键字。例如:
public Number getValue(final Comparable key) {
Number result = null;
final int index = getIndex(key);
if (index >= 0) {
result = getValue(index);
}
return result;
}
分析:源码中大量在方法中使用了public Number getValue(final Comparable key) final关键字。使方法中不需要改变作为参数的对象变量时,明确使用final进行声明,会防止无意的修改而影响到调用方法。
小结:在方法内部声明为final,灵活的使用的final提升了程序速度,也明确了不能修改的变量,而且还体现了程序的强内聚,由于final出现在方法内部,所以不会出现把类的成员声明为final,在之后难以修改类的局面,这种使用final的方法,是很符合逻辑的。
报告3:如何适应输入任意类型的数字
在jfreechart中使用的数据集,当对数据集合赋值得时候,会发现你可以输入任意类型得数字,我本已为jfreechat可以实现任意输入数字,可以实现任意形式得多态转换,但是最后我发现,原来是使用了NumberFormat类得format方法,这个方法可以实现任意类型,转换成字符串,从表面上看上去,很象实现得任意数字类型得多态。
以下我写了一个简单例子,来说明这个问题的实现过程:
功能:输入任意类型得数字,程序对输入得数字类型,实现对应的转换,最后输入String类型。
package myPack;
import java.lang.Number;
import java.lang.Comparable;
import java.util.ArrayList;
import java.text.NumberFormat;
/* 例子实现得用户任意输入数字类型,转换成对应得字符串
例如:输入 int 22 结果: 22
输入 float 22f 结果: 22
输入 double 22.22 结果: 22.22
输入 double 22.22L 结果: 22.22
*/
public class MatchAnyNumber {
private ArrayList list = null;
private NumberFormat numberFormat = null;
public MatchAnyNumber() {
list = new ArrayList();
numberFormat= NumberFormat.getNumberInstance();
}
public void setInfo(){
try{
// 测试Int型数字
NumberInfo ni1 = new NumberInfo();
ni1.setName("int");
ni1.setValue(22);
list.add(ni1);
// 测试Float型数字
NumberInfo ni2 = new NumberInfo();
ni2.setName("float");
ni2.setValue(22.22F);
list.add(ni2);
// 测试Double型数字
NumberInfo ni3 = new NumberInfo();
ni3.setName("double");
ni3.setValue(22.22D);
list.add(ni3);
// 测试Long型数字
NumberInfo ni4 = new NumberInfo();
ni4.setName("long");
ni4.setValue(22L);
list.add(ni4);
}
catch(Exception e){
e.printStackTrace();
}
}
public void getInfo(){
java.util.Iterator iter = list.iterator();
while(iter.hasNext()){
NumberInfo ni = (NumberInfo) iter.next();
String testName = ni.getName().toString();
String testValue = numberFormat.format(ni.getValue());
System.out.println("input number type:"+testName+"/ value:"+ni.getValue());
System.out.println("out number type:"+testName+"/ value:"+testValue);
}
}
private class NumberInfo{
private Comparable name = null;
private Number value = null;
public void setName(final Comparable name){
this.name = name;
}
public Comparable getName(){
return this.name;
}
public void setValue(final Number value){
this.value = value;
}
public void setValue(final double value){
setValue(new Double(value));
}
public Number getValue(){
return this.value;
}
}
public static void main(String[] args){
MatchAnyNumber test = new MatchAnyNumber();
test.setInfo();
test.getInfo();
}
}
输出结果:
input number type:int/ value:22.0
out number type:int/ value:22
input number type:float/ value:22.219999313354492
out number type:float/ value:22.22
input number type:double/ value:22.22
out number type:double/ value:22.22
input number type:long/ value:22.0
out number type:long/ value:22
结论:面向Number接口的编程,加上数字类型的转换,实现了数据集合,可以输入任意数字类型。
报告4:如何面向接口编程
网上有很多人在谈论面向接口编程,但是没有很详细,说出真正使用接口的价值。
经过分析jfreechart可以清晰的获得,面向接口编程的特点。
例如:jfeechart中绘制圆饼图,使用数据集合的定义如下:
//PieDataset是一个接口
//DefaultPieDataset是一个实现PieDataset接口的实体类
private PieDataset createDataset() {
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("One", 10;
return dataset;
}
// 后续操作都在使用PieDataset对象
分析:代码中可以看到数据集实例化的时候,使用的是DefaultPieDataset类,但是返回的是一个接口PieDataset,在传递和调用的时候,都使用的是接口PieDataset对象,但是当操作时候,对象实际调用的是实体类的DefaultPieDataset对象, 在Jfreechart源码中,如果要使用链表,那么就传递List,如果要使用数字,那么就传递Number,如果要使用String,那么就传递Comparable,这些都是面向接口编程的体现。
优点:面向接口和抽象类的编程,可以使程序变的很灵活,在程序传递对象过程中,都使用的是接口和抽象类,如果实现这些接口的实体类,发生修改变化,可以直接修改这些实体类,其他调用这些程序的地方可以不用修改,或是很少量的修改,这样实现强内聚底偶合。
缺点:程序的可读性能下降,对于初级程序员,很难了解程序结构。
结论:面向接口和抽象类编程是大事所驱的,人心所向的事情,可能有人说那不一定,但是从实际编程经验来说,这是程序员必经之路,这种编程适合,很强的编程团队,这样编写的程序,可以适应用户的需求变化,改动相对很少,但是要求程序员本身素质也很高。
本文章未经过作者同意,不能转载。如有任何问题,请发送E-mail:llhdf@yahoo.com.cn
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/llhdf/archive/2005/01/26/268779.aspx
分享到:
相关推荐
jfreechart-0.9.21的jar包和jfreechart-0.9.21-demo
总的来说,JFreeChart 0.9.21版本提供了一个全面且灵活的图表解决方案,无论是在数据分析、项目管理还是数据可视化领域,都能发挥其强大功能。通过深入理解和熟练运用这个库,开发者可以创建出专业且引人注目的图表...
JFreeChart支持将图表导出为多种格式,如PNG、JPEG、PDF等,以便于报告或网页集成。通过源码,你可以学习如何将绘制好的图表保存为图像文件或者打印出来。 6. **与其他技术的集成** JFreeChart可以轻松地与Swing...
**JFreeChart 源码解析** JFreeChart 是一个流行的 Java 图表库,它提供了丰富的图表类型,如柱状图、饼图、线图、散点图等,广泛用于数据可视化。`jfreechart1.0.12` 版本的 Demo 源码是了解 JFreeChart 库如何...
4. **导出与打印**:除了在屏幕上显示,JFreeChart 还支持将图表导出为各种图像格式(如 PNG、JPEG、SVG),或者直接打印,方便报告和演示。 5. **集成友好**:JFreeChart 可以无缝集成到 Swing 应用程序和 Web ...
在Java Web开发中,尤其是在Servlet环境下,JFreeChart 可以帮助开发者在网页上生成各种数据可视化展示,便于用户理解和分析数据。 **一、JFreeChart 概述** 1. **安装与导入**:JFreeChart 通常以 jar 包的形式...
JFreeChart是JAVA平台上的一个开放的图表绘制类库。它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计。JFreeChart可生成饼图(pie charts)、柱状图(bar charts)、散点图...
JFreeChart是一款强大的Java图表库,它允许开发者创建多种类型的2D图表,如柱状图、饼图、线形图、散点图等,适用于报表、数据分析和可视化应用。1.0.19版本是其稳定的一个版本,包含了丰富的功能和优化。 1. **...
这个“jfreechart源码”压缩包包含的是JFreeChart项目的源代码,这对于开发者来说是一个宝贵的学习资源,能够深入了解图表绘制的内部机制,以及如何自定义图表的各个元素。 首先,源码是了解任何软件工作原理的最...
**JFreeChart 制图源码包详解** JFreeChart 是一个开源的 Java 图形库,它提供了丰富的图表类型,可以用于创建高质量的可视化数据。这个源码包专注于讲解如何利用 JFreeChart 在 Web 环境下进行图表制作,涵盖了...
无论是用于学术研究、商业报告还是数据分析,JFreeChart都能够帮助开发者以直观的方式呈现复杂的数据,提高信息传达的效率。同时,其开源属性使得它具有很高的灵活性和可定制性,是Java开发者的得力助手。
它广泛应用于数据分析、报告生成以及GUI应用中,提供了丰富的API和自定义选项,使得开发者能够轻松地在Java应用程序中集成高质量的图表。 ### 1. **JFreeChart基础概念** JFreeChart的核心是`ChartFactory`类,它...
这个“JFreeChart demo 源码”包含了官方示例程序的完整源代码,对于理解和使用 JFreeChart 来创建自定义图表来说,具有极高的学习价值。 JFreeChart 的核心功能在于它能够方便地将数据转换为可视化图形。其源码中...
这个"jfreechart-1.0.19demo源码"是JFreeChart库的一个特定版本——1.0.19的演示代码集合,包含了各种示例和用法,帮助开发者理解和学习如何使用该库。 JFreeChart库的主要特点包括: 1. **图表类型丰富**:...
二、JFreeChart 1.0.9源码分析 2.1 源码结构 JFreeChart的源码结构清晰,主要分为几个核心模块: - ChartFactory:提供创建各种图表的工厂方法。 - ChartComponent:表示图表组件,如Legend(图例)、Title(标题)...
1、解压jfreechart_0.9.21.zip到指定位置,其中source是jfreechart的源码,jfreechart-0.9.21-demo.jar 是例子程序(该部分留给大家自己去研究) 2、为了配置成功,我们需要关注的文件有如下三个:jfreechart-...
2:使用ChartFactory 的多个工厂方法,createXXXChart来创建统计图表,统计图标就是一个JFreeChart对象 3:得到JFreeChart对象后,可以调用setTitle来修改统计图标的标题。或者调用getLegend方法来指定图标用例,...