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

2023-06-14,,

示例一:

    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(, ));  
           System.out.println(subtract(, ));  
        }  
    }  
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));
}
}

示例二:
这是我们工程中匿名内部类在分页方法中的运用,动态拼接分页链接地址:

    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("?") > ) {  
                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());  
        }  
      
    }  
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层代码中有使用。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
 

返回顶楼
 
feiyu86
等级: 初级会员

性别:
文章: 58
积分: 0
来自: 上海

   发表时间:2011-11-19  
 

刚好也不是太了解什么场景下应该使用匿名内部类,正好可以学习下,加深一下了解!

返回顶楼 回帖地址
0 0 请登录后投票
 
kidneyball
等级:

性别:
文章: 354
积分: 150
来自: 南太平洋

   发表时间:2011-11-21   最后修改:2011-11-21
 

在java8出来之前,内部类最本质的作用是可以访问外部对象的状态和外部方法的final变量。换言之,模拟闭包。
其它特性都是单纯节省代码量,只有这个作用是暂时无法替代的。

返回顶楼 回帖地址
1 0 请登录后投票
 
sxpyrgz
等级: 初级会员

性别:
文章: 59
积分: 70
来自: 北京

   发表时间:2011-11-21  
 

如果看一下,SWING的各中事件管理,你就OK了

返回顶楼 回帖地址
0 0 请登录后投票
 
黑白两相望
等级: 初级会员

性别:
文章: 372
积分: 70
来自: 上海

   发表时间:2011-11-21  
 

kidneyball 写道
在java8出来之前,内部类最本质的作用是可以访问外部对象的状态和外部方法的final变量。换言之,模拟闭包。
其它特性都是单纯节省代码量,只有这个作用是暂时无法替代的。

  犀利

返回顶楼 回帖地址
0 0 请登录后投票
 
endisonlai
等级: 初级会员

性别:
文章: 19
积分: 30
来自: 昆明

   发表时间:2011-11-21  
 

lz给出的第一个实例,是回调的使用
第二个实例,是事件监听机制的使用。
可多看看基于事件监听的框架就明白怎么使用了。
另外,可考虑在只会使用到一次,并且逻辑不复杂的地方使用。

返回顶楼 回帖地址
0 0 请登录后投票
 
mfkvfn
等级: 初级会员

性别:
文章: 292
积分: 40
来自: 深圳

   发表时间:2011-11-21   最后修改:2011-11-21
 

kidneyball 写道
在java8出来之前,内部类最本质的作用是可以访问外部对象的状态和外部方法的final变量。换言之,模拟闭包。
其它特性都是单纯节省代码量,只有这个作用是暂时无法替代的。

+1    说得很简洁,一语中的。偶像啊。

返回顶楼 回帖地址
0 0 请登录后投票
 
Ulysses
等级: 初级会员

性别:
文章: 53
积分: 30
来自: 杭州

   发表时间:2011-11-21  
 

java的集合使用了private的Iterator类.这样可以保证你只能获取iterator()方法返回的iterator接口,而无法得到具体实现类

返回顶楼 回帖地址
0 0 请登录后投票
 
kidneyball
等级:

性别:
文章: 354
积分: 150
来自: 南太平洋

   发表时间:2011-11-21  
 

kidneyball 写道
在java8出来之前,内部类最本质的作用是可以访问外部对象的状态和外部方法的final变量。换言之,模拟闭包。
其它特性都是单纯节省代码量,只有这个作用是暂时无法替代的。

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

返回顶楼 回帖地址
0 0 请登录后投票
 
Ben.Sin
等级: 初级会员

性别:
文章: 31
积分: 30
来自: 广州

   发表时间:2011-11-22  
 

kidneyball 写道

kidneyball 写道
在java8出来之前,内部类最本质的作用是可以访问外部对象的状态和外部方法的final变量。换言之,模拟闭包。
其它特性都是单纯节省代码量,只有这个作用是暂时无法替代的。

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

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

java匿名内部类使用场景列举的相关教程结束。

《java匿名内部类使用场景列举.doc》

下载本文的Word格式文档,以方便收藏与打印。