`
lippeng
  • 浏览: 454890 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java 实现闭包 之 HelloWorld

阅读更多

闭包,就不多说了,很多语言都支持。听说Java1.7,也会在这方面做新功能。

今天,就先看看俺用内部类,实现的闭包吧!

 

先写个接口出来:

 

package com.lippeng;

/**
 * 随便定义一个接口,里面有个方法
 * 
 * @author lippeng
 * 
 */
public interface Isayer {
	public void say();
}

 

今天的主题,闭包内部的实现:

 

package com.lippeng;

/**
 * 这个类做成单例的,但是,不提供等到这个类的对象的方法
 * 
 * 即,在本類的外部,無法得到這個類的實例
 * 
 * @author lippeng
 * 
 */
public class HelloWorld {

	// 偷个懒,直接负值了
	private static HelloWorld helloWorld = new HelloWorld("default string");

	// 看好了,这个东西,是HelloWorld的属性
	private String word;

	/**
	 * Constructor
	 * 
	 * @param word
	 */
	private HelloWorld(String word) {
		this.word = word;
	}

	private class Recorder implements Isayer {

		@Override
		public void say() {

			// 打出 外部类的属性
			System.out.println(word);
		}
	}

	private class Recorder2 implements Isayer {

		@Override
		public void say() {

			// 倒序打出外部类的属性
			System.out.println(new StringBuffer(word).reverse().toString());
		}
	}

	/**
	 * 这个方法,只是得到一个内部类对象
	 * 
	 * @return
	 */
	public static Isayer getSayer() {
		// 根据需要,这里可以 这样写,参数想从外部传过来,也很简单
		//return new HelloWorld("").new Recorder();
		return helloWorld.new Recorder();
	}

	public static Isayer getReverseSayer() {
		return helloWorld.new Recorder2();
	}

	/**
	 * 如果不提供这个方法,HelloWorld 就是完全封闭的环境了
	 * 
	 * @param word
	 */
	public static void setWord(String word) {
		helloWorld.word = word;
	}

}
 

写个测试类看看:

 

package com.lippeng;

public class TestClosure {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		// 得到 接口:它的好处是,helloWorld对象完全可见
		Isayer recorder = HelloWorld.getSayer();
		recorder.say();// 这里说出来的东西,来自 helloWorld 对象

		// 只是这样,好处还不明显,看下面的

		// 想说的是,同一个接口,实现不同的功能
		Isayer reverseSayer = HelloWorld.getReverseSayer();
		reverseSayer.say();

		System.out.println("---------------------");

		// 改变下 HelloWorld 的属性值
		HelloWorld.setWord("Hello World");

		// 打出来看看
		recorder.say();
		reverseSayer.say();

		System.out.println("---------------------");
		System.out.println("变了,真的变了,闭包实现了。。。");
	}
}
 

俺习惯在代码中加注释,不喜欢旁白。。。

1
3
分享到:
评论
1 楼 sodagreen.simplicity 2016-09-04  
两个疑问:

1. 为什么必须用接口返回闭包?是必须的吗?我自己不实现接口也可以返回。
2. 这个闭包里其实只是简单地引用了外部类的数据,闭包内部本身并未存储数据,这个不具备闭包的意义,使用普通的方法就可以了。虽然意思是get到了,不过感觉例子还可以改进呢?

个人想法哈。

相关推荐

    helloworld-jsp-3.0.4.zip

    【标题】"helloworld-jsp-3.0.4.zip" 指向的是一个包含JSP(JavaServer Pages)示例程序的压缩文件,版本为3.0.4。JSP是Java平台上的动态网页技术,允许开发人员在HTML或XML文档中嵌入Java代码,从而实现服务器端的...

    面向Java开发者的Scala教程

    - **函数式编程**:Scala支持高阶函数、闭包和模式匹配等函数式编程特性,这些在Java中需要借助额外的库或Java 8及以上版本的Lambda表达式实现。 - **案例类和模式匹配**:Scala的案例类和模式匹配提供了处理数据...

    Java中使用Groovy的三种方式

    无论是作为嵌入式脚本快速实现功能,还是作为类库扩展Java项目,或者是在Grails或Spring Boot框架中使用,Groovy都能为Java开发者带来诸多便利。掌握Groovy的这些使用方式,能帮助开发者更好地适应现代Java开发环境...

    Gradle 工作中常用点 亲测一1

    Closure3('Hello world', 1) // 输出 'Hello world : 1' // 使用变量的闭包 def var = "Hello world" def Closure4 = { println var } Closure4() // 输出 'Hello world' ``` 闭包在Groovy中广泛应用,可以用于函数...

    groovy调用java-se类库学习案例 Java学习资料

    动态方法调用则允许你使用Groovy的语法糖,比如调用`System.out.println("Hello, World!")`,这里的`println`实际上是Java中的`print`和`println`方法的结合。 在"groovy-se-study"项目中,你可能能看到如何在...

    java 动态脚本语言 精通 Groovy

    println 'Hello, World!' } sayHello // 没有括号 ``` 2. **动态特性**:Groovy是动态类型的,这意味着变量的类型在运行时确定,不需要在声明时指定。这种灵活性允许快速开发和原型设计,但可能导致运行时错误...

    [Groovy入门]第五讲.将流程控制语句与方法重构为闭包

    对于条件语句,如`if`,我们可以使用`find`、`any`或`collect`等方法结合闭包来实现。比如查找数组中的偶数: ```groovy def numbers = [1, 2, 3, 4, 5] def evenNumbers = numbers.findAll { it % 2 == 0 } // ...

    从Java到Go的过渡:实现一个移动应用后端服务.docx

    fmt.Fprint(w, "Hello, world!") }) http.ListenAndServe(":8080", nil) } ``` 这段代码创建了一个监听在8080端口的HTTP服务器。其中`http.HandleFunc`用于注册处理函数,而`http.ListenAndServe`则启动...

    groovy语法1

    闭包是Groovy的核心特性之一,可以用来实现函数式编程风格。闭包可以捕获并操作其所在上下文的变量,提供了强大的功能和灵活性。 Groovy的字符串处理也有其特色。单引号括起的字符串与Java中的String相同,而双引号...

    Hello DWR 实例,一个完整的可以运行的例子

    2. **创建Java类和方法**:在服务器端,我们会有一个简单的Java类,比如`HelloWorld`,包含一个`sayHello()`方法,这个方法会被暴露给JavaScript调用。 3. **生成JavaScript接口**:DWR会自动生成对应的JavaScript...

    groovy入门实例代码详细(包括字符串,map,闭包等等)

    - 字符串拼接使用`+`运算符,例如`"Hello," + " World!"`。 - 字符串格式化可以使用`String.format()`方法,或者直接在双引号字符串中使用`%`占位符。 - Groovy还支持多行字符串,使用三引号`"""`包裹。 2. **...

    Grails快速入门

    3. **运行Groovy脚本**:右键点击`HelloWorld.groovy`文件,选择`Run As -> Groovy Script`或`Run As -> Java Application`。控制台将会输出`Hello World`。 此外,还可以尝试更复杂的示例,例如: ```groovy ...

    Groovy安装以及简单使用

    在压缩包文件`GroovyDemo`中,可能包含了各种Groovy脚本示例,如上述的Hello World程序或者使用闭包的示例。通过查看这些示例,读者可以更直观地理解Groovy的语法和特性,并动手实践,从而更好地掌握Groovy的使用。 ...

    Grails 3.X开发实战

    // 声明一个变量名称为hello且值为HelloWorld的字符串类型变量。 def hello = "HelloWorld" // 在控制台输出This is my first groovy program. println "This is my first groovy program." // 在控制台输出hello...

    Groovy入门教程(一).pdf

    然后,可以在Groovy源文件夹下创建新的Groovy类,例如HelloWorld类。Groovy的主方法可以比Java更简洁,只需包含打印语句,如`println "Hello World"`。 Groovy的语法特性包括: 1. 变量声明:Groovy中的所有变量都...

    Groovy轻松入门

    public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } } ``` 此外,Groovy支持内建的GroovyShell和GroovyScriptEngine,使得运行和测试Groovy脚本变得...

    Groovy入门教程(一).docx

    然后,可以新建Groovy类并编写代码,如经典的`HelloWorld`示例。 Groovy的语法特点包括: 1. 变量声明:Groovy中的变量默认是对象,无需显式声明类型,通常使用`def`关键字。例如,`def var = "hello world"`,...

Global site tag (gtag.js) - Google Analytics