当前位置:  编程技术>综合
本页文章导读:
    ▪Effective Java:Ch2_创建销毁对象:Item2_当构造函数参数过多时考虑使用builder              静态工厂和构造函数都有一个限制:可选参数数量很大时,他们都不能很好地扩展。考虑一下这个例子:用一个类来表示袋装食品上的营养成分标签,这些标.........
    ▪Struts2 框架实现多文件上传下载      web.xml配置: [xhtml] view plaincopyprint? <?xml version="1.0" encoding="UTF-8"?>  <web-app version="2.5"       xmlns="http://java.sun.com/xml.........
    ▪And,Where使用提示以及用+进行左关联的提示       1 and 和where的滥用 用的时候 请多注意                       下面的三段代码的效果肯定是不一样的   &nbs.........

[1]Effective Java:Ch2_创建销毁对象:Item2_当构造函数参数过多时考虑使用builder
    来源: 互联网  发布时间: 2013-11-10

        静态工厂和构造函数都有一个限制:可选参数数量很大时,他们都不能很好地扩展。考虑一下这个例子:用一个类来表示袋装食品上的营养成分标签,这些标签有几个必选字段:每份的含量、每罐的份数、每份的卡路里;还有超过20个可选字段:总脂肪含量、饱和脂肪含量、转化脂肪含量、胆固醇含量、钠含量等等。大多数产品只有少数几个可选字段是非零值。


        你将为这种类编写怎样的构造函数或者静态工厂呢?程序员习惯上会使用telescoping constructor模式,提供一个值包含必选参数的构造函数,以及一个包含一个可选参数的构造函数、一个包含二个可选参数的构造函数、等等,最后一个构造函数包含所有可选参数。【例】就像下面的示例那样,简单起见,我们只展示4个可选参数的情况。

// Telescoping constructor pattern - does not scale well!
public class NutritionFacts {
	private final int servingSize;   // (mL) required
	private final int servings;      // (per container) required
	private final int calories;      //      optional
	private final int fat;           // (g)  optional
	private final int sodium;        // (mg) optional
	private final int carbohydrate;  // (g)  optional
	public NutritionFacts(int servingSize, int servings) {
		this(servingSize, servings, 0);
	}
	public NutritionFacts(int servingSize, int servings,
		int calories) {
		this(servingSize, servings, calories, 0);
	}
	public NutritionFacts(int servingSize, int servings,
		int calories, int fat) {
		this(servingSize, servings, calories, fat, 0);
	}
	public NutritionFacts(int servingSize, int servings,
		int calories, int fat, int sodium) {
		this(servingSize, servings, calories, fat, sodium, 0);
	}
	public NutritionFacts(int servingSize, int servings,
	int calories, int fat, int sodium, int carbohydrate) {
		this.servingSize  = servingSize;
		this.servings     = servings;
		this.calories     = calories;
		this.fat          = fat;
		this.sodium       = sodium;
		this.carbohydrate = carbohydrate;
	}
}

        当想要创建实例时,使用包含你想要设置的所有参数的最短的参数列表的那个构造函数:

NutritionFacts cocaCola =
new NutritionFacts(240, 8, 100, 0, 35, 27);
        通常这种构造方法调用要求你传入一些你并不想设置的参数,但是不得不为这些参数传入一个值。在上例中,我们给参数fat传入了值0,因为只有6个参数,这看起来也还不算太糟,但是随着参数数目增长,很快就会无法控制。       

        简言之,telescoping constructor模式虽然可行,但是当参数过多时就很难编写客户端代码,而且更加难以阅读。读者会奇怪这些参数都表示什么含义,必须仔细地数着参数才能弄明白。一长串类型相同的参数会导致微妙的bug。如果客户端意外弄反了两个参数的顺序,编译器不会报错,但是程序在运行时会出现错误的行为(Item40)。


        遇到多个构造函数参数的第二种方法是JavaBeans模式,先调用无参数的构造函数创建对象,然后调用setter方法设置每个必选参数以及感兴趣的那些可选参数的值。【例】:

// JavaBeans Pattern - allows inconsistency, mandates mutability
public class NutritionFacts {
	// Parameters initialized to default values (if any)
	private int servingSize = -1;  // Required; no default value
	private int servings     = -1;  //     "     "     "      "
	private int calories     = 0;
	private int fat          = 0;
	private int sodium       = 0;
	private int carbohydrate = 0;
	public NutritionFacts() { }
	// Setters
	public void setServingSize(int val) { servingSize = val; }
	public void setServings(int val) { servings = val; }
	public void setCalories(int val) { calories = val; }
	public void setFat(int val) { fat = val; }
	public void setSodium(int val) { sodium = val; }
	public void setCarbohydrate(int val) { carbohydrate = val; }
}
        这种模式没有telescoping constructor模式那种缺点。易于创建实例,而且产生的代码页易于阅读:
NutritionFacts cocaCola = new NutritionFacts();
cocaCola.setServingSize(240);
cocaCola.setServings(8);
cocaCola.setCalories(100);
cocaCola.setSodium(35);
cocaCola.setCarbohydrate(27);
        不幸的是,JavaBeans模式自身有重大缺陷。由于构造过程分成了多个调用,在构建过程中JavaBean可能处于不一致状态。类不能通过检查构造函数参数的有效性来保证一致性。如果尝试使用处于不一致状态的对象,就会导致错误,而且产生这些错误的代码大相径庭,导致很难调试。相关的另一个缺点是,JavaBean模式阻止了把类变为“不可变”(Item15)的可能性,而且要求程序员付出额外努力来保证线程安全。

        有一种办法可以降低这个缺点:当对象构建完成后,手工“冻结”该对象,并且不允许使用未冻结的对象。不过这种方法不灵便,在实践中很少使用。更重要的是,由于编译器不能确保程序员在使用对象前先调用其冻结方法,所以这种方法可能导致运行时错误。

       

        幸运的是,还有第三种方法结合了telescoping constructor模式的安全性以及JavaBeans模式的可读性。这是Builder模式的一种形式。客户端并不直接构造需要的对象,而是先调用一个包含所有必选参数的构造函数(或静态工厂),得到一个builder object;然后,客户端在该builder object上调用类似setter的方法来设置各个感兴趣的可选参数;最后,客户端调用无参数的build方法生成对象(不可变对象)。——build相当于冻结方法

        builder是所要构建的类的一个静态成员类(Item22)。【例】如下是它的示例:

//Builder Pattern
public class NutritionFacts{
	private final int servingSize;
	private final int servings;
	private final int calories;
	private final int fat;
	private final int sodium;
	private final int carbohydrate;
	
	public static class Builder{
		//必选参数
		private final int servingSize;
		private final int servings;
		//可选参数
		private final int calories = 0;
		private final int fat = 0;
		private final int carbohydrate = 0;
		private final int sodium = 0;
		
		//Builder构造函数设置所有必选参数
		public Builder(int servingSize, int servings){
			this.servingSize = servingSize;
			this.servings = servings;
		}
		
		//Builder类setter方法设置可选参数
		public Builder calories(int v){
			this.calories = v;
			return this;
		}
		public Builder fat(int v){
			this.fat = v;
			return this;
		}
		public Builder carbohydrate(int v){
			this.carbohydrate = v;
			return this;
		}
		public Builder sodium(int v){
			this.sodium = v;
			return this;
		}
		
		//builde()返回需要构建的对象
		public NutritionFacts build(){
			return new NutritionFacts(this);
		}		
	}
	
	private NutritionFacts(Builder builder){
		servingSize = builder.servingSize;
		servings 	= builder.servings;
		calories	= builder.calories;
		fat			= builder.fat;
		sodium		= builder.sodium;
		carbohydrate= builder.carbohydrate;
	}
}
        注意,NutritionFacts是不可变的(未提供setter方法),并且所有的参数值得默认值都放在一个地方。builder的setter方法返回builder自身,所以setter的调用可以链接起来。客户端代码就像下面这样:

NutritionFacts coca = new NutritionFacts.Builder(240,8)
		.calories(100).sodium(35).build();

        这种客户端代码易于编写,而且更重要的是易于阅读。Builder模式模拟了Ada和Python中的具名可选方法(named optional parameters)。


        builder 就像构造方法一样,能在其参数上强加约
    
[2]Struts2 框架实现多文件上传下载
    来源: 互联网  发布时间: 2013-11-10

web.xml配置:

[xhtml] view plaincopyprint?
  • <?xml version="1.0" encoding="UTF-8"?>  
  • <web-app version="2.5"   
  •     xmlns="http://java.sun.com/xml/ns/javaee"   
  •     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  •     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  •     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  •   <welcome-file-list>  
  •     <welcome-file>index.jsp</welcome-file>  
  •   </welcome-file-list>  
  •   <filter>  
  •     <filter-name>struts2</filter-name>  
  •     <filter-class>  
  •         org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter  
  •     </filter-class>  
  •   </filter>  
  •   <filter-mapping>  
  •     <filter-name>struts2</filter-name>  
  •     <url-pattern>*.action</url-pattern>  
  •   </filter-mapping>  
  •   </web-app>  
  •  

    struts.xml配置:

    [xhtml] view plaincopyprint?
  • <?xml version="1.0" encoding="UTF-8" ?>  
  • <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">  
  • <struts>  
  •   
  • <constant name="struts.i18n.encoding" value="utf-8" />    
  •   
  • <package name="file" extends="struts-default">  
  •     <action name="showUpload">  
  •         <result>/upload.jsp</result>  
  •     </action>  
  •       
  •     <action name="upload" alt">        <result name="input">/upload.jsp</result>  
  •         <result>/download.jsp</result>  
  •         <interceptor-ref name="fileUpload">  
  •         <param name="maximumSize">2097152</param
        
  • [3]And,Where使用提示以及用+进行左关联的提示
        来源: 互联网  发布时间: 2013-11-10

     1 and 和where的滥用 用的时候 请多注意
              
               下面的三段代码的效果肯定是不一样的           
               (1) select A.a1 ,B.b3
                from A left join B
                on A.a2=B.b2
                where A.a3=1
                and B.b3=2
                先左关联后 在过滤 假如关联的结果里面B.b3=null 那么 你在where后面在加B.b3=2 那么结果中B.b3肯定是没有null的情况的 
               (2) select A.a1 ,B.b3
                from A left join B
                on A.a2=B.b2
                and B.b3=2
                where A.a3=1
               关联前 先过掉B的b3=2的条件 然后再左关联起来 那么这个结果可能B.a3会有null的情况的
               (3) select A.a1 ,B.b3
                from A left join B
                on A.a2=B.b2
                and B.b3=2
                and A.a3=1 关联前 先过掉B中的B3=2和A中的a3=1条件 然后再关联起来 那么这个结果可能B.b3会有null的情况的

             所以大家在用where 和and 的时候    放的位置 请多注意了

            2 用+进行左关联 缺陷 也许可以有解决方案 待后续
            
              (1) select A.a1 ,B.b3
                from A , B
                where A.a2=B.b2(+)
                and A.a3(+)=1
                and B.b3(+)=2
                这个 条件 应该是 和 1里面的(1)的情况一样

               先左关联后 在过滤 假如关联的结果里面B.b3=null 那么 你在where后面在加B.b3=2 那么结果中B.b3肯定是没有null的情况的 
                也就是说 用+进行左关联没有用left join 灵活 待后续看是否有什么好的解决方案

    作者:yefighter 发表于2013-1-11 14:53:24 原文链接
    阅读:39 评论:0 查看评论

        
    最新技术文章:
    ▪error while loading shared libraries的解決方法    ▪版本控制的极佳实践    ▪安装多个jdk,多个tomcat版本的冲突问题
    ▪简单选择排序算法    ▪国外 Android资源大集合 和个人学习android收藏    ▪.NET MVC 给loading数据加 ajax 等待loading效果
    ▪http代理工作原理(3)    ▪关注细节-TWaver Android    ▪Spring怎样把Bean实例暴露出来?
    ▪java写入excel2007的操作    ▪http代理工作原理(1)    ▪浅谈三层架构
    ▪http代理工作原理(2)    ▪解析三层架构……如何分层?    ▪linux PS命令
    ▪secureMRT Linux命令汉字出现乱码    ▪把C++类成员方法直接作为线程回调函数    ▪weak-and算法原理演示(wand)
    ▪53个要点提高PHP编程效率    ▪linux僵尸进程    ▪java 序列化到mysql数据库中
    ▪利用ndk编译ffmpeg    ▪活用CSS巧妙解决超长文本内容显示问题    ▪通过DBMS_RANDOM得到随机
    ▪CodeSmith 使用教程(8): CodeTemplate对象    ▪android4.0 进程回收机制    ▪仿天猫首页-产品分类
    ▪从Samples中入门IOS开发(四)------ 基于socket的...    ▪工作趣事 之 重装服务器后的网站不能正常访...    ▪java序列化学习笔记
    编程技术>综合 iis7站长之家
    ▪ORACLE 常用表达式    ▪记录一下,AS3反射功能的实现方法    ▪u盘文件系统问题
    ▪java设计模式-观察者模式初探    ▪MANIFEST.MF格式总结    ▪Android 4.2 Wifi Display核心分析 (一)
    ▪Perl 正则表达式 记忆方法    ▪.NET MVC 给loading数据加 ajax 等待laoding效果    ▪java 类之访问权限
    ▪extjs在myeclipse提示    ▪xml不提示问题    ▪Android应用程序运行的性能设计
    ▪sharepoint 2010 自定义列表启用版本记录控制 如...    ▪解决UIScrollView截获touch事件的一个极其简单有...    ▪Chain of Responsibility -- 责任链模式
    ▪运行skyeye缺少libbfd-2.18.50.0.2.20071001.so问题    ▪sharepoint 2010 使用sharepoint脚本STSNavigate方法实...    ▪让javascript显原型!
    ▪kohana基本安装配置    ▪MVVM开发模式实例解析    ▪sharepoint 2010 设置pdf文件在浏览器中访问
    ▪spring+hibernate+事务    ▪MyEclipse中文乱码,编码格式设置,文件编码格...    ▪struts+spring+hibernate用jquery实现数据分页异步加...
    ▪windows平台c++开发"麻烦"总结    ▪Android Wifi几点    ▪Myeclipse中JDBC连接池的配置
    ▪优化后的冒泡排序算法    ▪elasticsearch RESTful搜索引擎-(java jest 使用[入门])...    ▪MyEclipse下安装SVN插件SubEclipse的方法
    ▪100个windows平台C++开发错误之七编程    ▪串口转以太网模块WIZ140SR/WIZ145SR 数据手册(版...    ▪初识XML(三)Schema
    ▪Deep Copy VS Shallow Copy    ▪iphone游戏开发之cocos2d (七) 自定义精灵类,实...    ▪100个windows平台C++开发错误之八编程
    ▪C++程序的内存布局    ▪将不确定变为确定系列~Linq的批量操作靠的住...    ▪DIV始终保持在浏览器中央,兼容各浏览器版本
    ▪Activity生命周期管理之三——Stopping或者Restarti...    ▪《C语言参悟之旅》-读书笔记(八)    ▪C++函数参数小结
    ▪android Content Provider详解九    ▪简单的图片无缝滚动效果    ▪required artifact is missing.
    ▪c++编程风格----读书笔记(1)    ▪codeforces round 160    ▪【Visual C++】游戏开发笔记四十 浅墨DirectX教程...
    ▪【D3D11游戏编程】学习笔记十八:模板缓冲区...    ▪codeforces 70D 动态凸包    ▪c++编程风格----读书笔记(2)
    ▪Android窗口管理服务WindowManagerService计算Activity...    ▪keytool 错误: java.io.FileNotFoundException: MyAndroidKey....    ▪《HTTP权威指南》读书笔记---缓存
    ▪markdown    ▪[设计模式]总结    ▪网站用户行为分析在用户市场领域的应用
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3