• java匿名内部类使用场景列举


    示例一:
    Java代码  收藏代码
    1. package com;  
    2.   
    3. interface Operation {  
    4.     double operateTwoIntNum(int a, int b);  
    5. }  
    6.   
    7. public class InnerClassTest {  
    8.   
    9.     /** 
    10.      * 加法 
    11.      */  
    12.     public static double add(int a, int b) {  
    13.         /** 
    14.          * 匿名内部类实现加法 
    15.          */  
    16.         double c = new Operation() {  
    17.   
    18.             @Override  
    19.             public double operateTwoIntNum(int a, int b) {  
    20.   
    21.                 return a + b;  
    22.             }  
    23.         }.operateTwoIntNum(a, b);  
    24.         return c;  
    25.     }  
    26.   
    27.     /** 
    28.      * 减法 
    29.      * @param a 
    30.      * @param b 
    31.      * @return 
    32.      */  
    33.     public static double subtract(int a, int b) {  
    34.         /** 
    35.          * 匿名内部类实现加法 
    36.          */  
    37.         double c = new Operation() {  
    38.   
    39.             @Override  
    40.             public double operateTwoIntNum(int a, int b) {  
    41.                 // TODO Auto-generated method stub  
    42.                 return a - b;  
    43.             }  
    44.         }.operateTwoIntNum(a, b);  
    45.         return c;  
    46.     }  
    47.   
    48.     public static void main(String[] args) {  
    49.        System.out.println(add(103));  
    50.        System.out.println(subtract(103));  
    51.     }  
    52. }  
    package com;
    
    interface Operation {
    	double operateTwoIntNum(int a, int b);
    }
    
    public class InnerClassTest {
    
    	/**
    	 * 加法
    	 */
    	public static double add(int a, int b) {
    		/**
    		 * 匿名内部类实现加法
    		 */
    		double c = new Operation() {
    
    			@Override
    			public double operateTwoIntNum(int a, int b) {
    
    				return a + b;
    			}
    		}.operateTwoIntNum(a, b);
    		return c;
    	}
    
    	/**
    	 * 减法
    	 * @param a
    	 * @param b
    	 * @return
    	 */
    	public static double subtract(int a, int b) {
    		/**
    		 * 匿名内部类实现加法
    		 */
    		double c = new Operation() {
    
    			@Override
    			public double operateTwoIntNum(int a, int b) {
    				// TODO Auto-generated method stub
    				return a - b;
    			}
    		}.operateTwoIntNum(a, b);
    		return c;
    	}
    
    	public static void main(String[] args) {
           System.out.println(add(10, 3));
           System.out.println(subtract(10, 3));
    	}
    }
    


    示例二:
    这是我们工程中匿名内部类在分页方法中的运用,动态拼接分页链接地址:
    Java代码  收藏代码
    1. public interface LinkBuilder {  
    2.     public StringBuffer getPagerUrl();  
    3.     //public void setPage(int page);  
    4.       
    5.     public StringBuffer getPageUrl(int page);  
    6. }  
    7.   
    8.   
    9. public abstract class AbstractLinkBuilder implements LinkBuilder {  
    10.   
    11.     @Override  
    12.     public final StringBuffer getPageUrl(int page) {  
    13.         StringBuffer url = new StringBuffer(XssFilterService.dhtmlSpecialchars(  
    14.                 this.getPagerUrl(), true));  
    15.         if (url.toString().indexOf("?") > 0) {  
    16.             url.append("&");  
    17.         } else {  
    18.             url.append("?");  
    19.         }  
    20.         url.append("page=").append(page);  
    21.         return url;  
    22.     }  
    23.   
    24. }  
    25.   
    26.   
    27.     Pager pager = Pager.register("newPagerWidget",new AbstractLinkBuilder() {@Override  
    28.                         public StringBuffer getPagerUrl() {  
    29.                             StringBuffer url = null;  
    30.                             if (queryAgentStore != null) {  
    31.   
    32.                                 url = new StringBuffer("agentstorelist.html?");  
    33.                                 if (StringUtils.isNotBlank(queryAgentStore  
    34.                                         .getStoreName()))// 店铺关键字  
    35.                                 {  
    36.                                     url.append("&queryAgentStore.storeName="+ XssFilterService.dhtmlSpecialchars(queryAgentStore.getStoreName()));  
    37.                                 }  
    38.                                 if (queryAgentStore.getCity()!=null)// 城市编码  
    39.                                 {  
    40.                                     url.append("&queryAgentStore.city="+ queryAgentStore.getCity());  
    41.                                 }  
    42.                                 if(orderByClause!=null&&!"".equals(orderByClause))  
    43.                                 {  
    44.                                     url.append("&orderByClause="+orderByClause);  
    45.                                 }  
    46.                             } else {  
    47.                                 url = new StringBuffer("agentstorelist.html");  
    48.                             }  
    49.                             return url;  
    50.                         }  
    51.   
    52.                     }, request);  
    53.   
    54. public class Pager  
    55. {  
    56. public Pager(LinkBuilder builder) {  
    57.         this.linkBuilder = builder;  
    58.     }  
    59. public String getUrl(int page) {  
    60.         return staticTool.process(this.linkBuilder.getPageUrl(page).toString());  
    61.     }  
    62.   
    63. }  
    public interface LinkBuilder {
    	public StringBuffer getPagerUrl();
    	//public void setPage(int page);
    	
    	public StringBuffer getPageUrl(int page);
    }
    
    
    public abstract class AbstractLinkBuilder implements LinkBuilder {
    
    	@Override
    	public final StringBuffer getPageUrl(int page) {
    		StringBuffer url = new StringBuffer(XssFilterService.dhtmlSpecialchars(
    				this.getPagerUrl(), true));
    		if (url.toString().indexOf("?") > 0) {
    			url.append("&");
    		} else {
    			url.append("?");
    		}
    		url.append("page=").append(page);
    		return url;
    	}
    
    }
    
    
    	Pager pager = Pager.register("newPagerWidget",new AbstractLinkBuilder() {@Override
    						public StringBuffer getPagerUrl() {
    							StringBuffer url = null;
    							if (queryAgentStore != null) {
    
    								url = new StringBuffer("agentstorelist.html?");
    								if (StringUtils.isNotBlank(queryAgentStore
    										.getStoreName()))// 店铺关键字
    								{
    									url.append("&queryAgentStore.storeName="+ XssFilterService.dhtmlSpecialchars(queryAgentStore.getStoreName()));
    								}
    								if (queryAgentStore.getCity()!=null)// 城市编码
    								{
    									url.append("&queryAgentStore.city="+ queryAgentStore.getCity());
    								}
    								if(orderByClause!=null&&!"".equals(orderByClause))
    								{
    									url.append("&orderByClause="+orderByClause);
    								}
    							} else {
    								url = new StringBuffer("agentstorelist.html");
    							}
    							return url;
    						}
    
    					}, request);
    
    public class Pager
    {
    public Pager(LinkBuilder builder) {
    		this.linkBuilder = builder;
    	}
    public String getUrl(int page) {
    		return staticTool.process(this.linkBuilder.getPageUrl(page).toString());
    	}
    
    }
    


    示例三:
    上篇博客中用策略模式改善dao层代码中有使用。
     
       发表时间:2011-11-19  
    刚好也不是太了解什么场景下应该使用匿名内部类,正好可以学习下,加深一下了解!
    0 请登录后投票
     
       发表时间:2011-11-21   最后修改:2011-11-21
    在java8出来之前,内部类最本质的作用是可以访问外部对象的状态和外部方法的final变量。换言之,模拟闭包。
    其它特性都是单纯节省代码量,只有这个作用是暂时无法替代的。
    1 请登录后投票
     
       发表时间:2011-11-21  
    如果看一下,SWING的各中事件管理,你就OK了
    0 请登录后投票
     
       发表时间:2011-11-21  
    kidneyball 写道
    在java8出来之前,内部类最本质的作用是可以访问外部对象的状态和外部方法的final变量。换言之,模拟闭包。
    其它特性都是单纯节省代码量,只有这个作用是暂时无法替代的。

      犀利
    0 请登录后投票
     
       发表时间:2011-11-21  
    lz给出的第一个实例,是回调的使用
    第二个实例,是事件监听机制的使用。
    可多看看基于事件监听的框架就明白怎么使用了。
    另外,可考虑在只会使用到一次,并且逻辑不复杂的地方使用。
    0 请登录后投票
     
       发表时间:2011-11-21   最后修改:2011-11-21
    kidneyball 写道
    在java8出来之前,内部类最本质的作用是可以访问外部对象的状态和外部方法的final变量。换言之,模拟闭包。
    其它特性都是单纯节省代码量,只有这个作用是暂时无法替代的。

    +1    说得很简洁,一语中的。偶像啊。
    0 请登录后投票
     
       发表时间:2011-11-21  
    java的集合使用了private的Iterator类.这样可以保证你只能获取iterator()方法返回的iterator接口,而无法得到具体实现类
    0 请登录后投票
     
       发表时间:2011-11-21  
    kidneyball 写道
    在java8出来之前,内部类最本质的作用是可以访问外部对象的状态和外部方法的final变量。换言之,模拟闭包。
    其它特性都是单纯节省代码量,只有这个作用是暂时无法替代的。


    嗯,还有一种作用,private的static内部类提供了一种“类私有”的可见性,而private的非static内部类提供了“对象私有”的可见性,这也是暂时在java里没有替代方案的(scala里就有)。
    0 请登录后投票
     
       发表时间:2011-11-22  
    kidneyball 写道
    kidneyball 写道
    在java8出来之前,内部类最本质的作用是可以访问外部对象的状态和外部方法的final变量。换言之,模拟闭包。
    其它特性都是单纯节省代码量,只有这个作用是暂时无法替代的。


    嗯,还有一种作用,private的static内部类提供了一种“类私有”的可见性,而private的非static内部类提供了“对象私有”的可见性,这也是暂时在java里没有替代方案的(scala里就有)。



    弱弱的问一句,final变量的访问跟匿名内部类有什么关系?

    作者:KeerDi —— 北方的后生

    出处:http://www.cnblogs.com/keerdi/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    Mybatis 与 spring mvc
    Extjs 表格横坐标显示问题
    Extjs 图片的自动缩放
    C# Winform 界面中各控件随着窗口大小变化
    spring 连接各种数据源的配置(转载)
    <转>(C#)WinForm窗体间传值
    java stack 底层详细
    java hashmap 底层详细
    java LinkedList 底层详细
    java ArrayList 底层详细
  • 原文地址:https://www.cnblogs.com/123hll/p/6902659.html
Copyright © 2020-2023  润新知