Java 匿名内部类 工厂模式

来源:互联网 发布:游戏产业链 知乎 编辑:程序博客网 时间:2024/06/16 09:28
public interface huhu {//接口,这里是空的,为了测试

}

public class Outter{

     public static final  mm=5;//这里声明了个变量,当然我们的关注点是final,这是因为匿名内部类想使用在其外部定义的对象(Java中万物皆对象),就必须要求参数的引用是final

public huhu info() {//创建一个继承自huhu这个接口的匿名类的对象,通过new表达式返回的引用被自动向上转型为对huhu接口的引用
return new huhu(){

               //匿名内部类肯定没有构造器咯,因为它名字是啥你都不知道
public int here;//包含字段和方法
public void saySomething() {
System.out.println(“hello”);//插桩,让我们知道程序运行到了此处
}
};//标记表达式的结束,而这个表达式包含了匿名内部类
}

     public static void main(String[] args) {

   }

}

为了具体说明其关系,这里详细解释:你新建了一个类并实现了huhu这个接口,最后将其向上转型,得到这个接口的引用。

总结:匿名类可以扩展类,也可以实现其接口(只能一个接口),不能兼而有之

用处:对于一些特殊的类,添加些小功能,而这又不适合以接口和继承方式来实现(杀鸡焉用牛刀对吧) 这样简单优雅

这里附上匿名内部类与工程模式的结合实现:(From Think In Java)

public interface BaseService {
void method1();
void method2();
}

public interface ServiceFactory {
BaseService getService();
}

package com.upcsogo.www;
class Implementation1 implements BaseService {
private Implementation1() {

}


@Override
public void method1() {
// TODO Auto-generated method stub
System.out.println("Implementation1 method1");
}


@Override
public void method2() {
// TODO Auto-generated method stub
System.out.println("Implementation2 method2");
}
public static ServiceFactory factory = new ServiceFactory() {


@Override
public BaseService getService() {
// TODO Auto-generated method stub
return new Implementation1();
}

};

}
class Implementation2 implements BaseService {
private Implementation2 () {

}


@Override
public void method1() {
// TODO Auto-generated method stub
System.out.println("Implementation2 method1");
}


@Override
public void method2() {
// TODO Auto-generated method stub
System.out.println("Implemtation2 method2");
}
public static ServiceFactory factory2 = new ServiceFactory() {


@Override
public BaseService getService() {
// TODO Auto-generated method stub
return new Implementation2();
}

};

}
public class FactoriesHere {


/**
* @param args
*/
public static void serviceConsumer(ServiceFactory fac) {
BaseService bs = fac.getService();
bs.method1();
bs.method2();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
serviceConsumer(Implementation1.factory);
serviceConsumer(Implementation2.factory2);
}


}


0 0
原创粉丝点击