源代码如下(使用jdk8):
@FunctionalInterface public interface Base<T> { /** * 获取对象 * @return 对象 */ T get(); }
@FunctionalInterface public interface BaseFactory<T> { /** * 创建新的值 * @return 新的值 */ Base<T> create(); }
public interface Key<K> extends Base<K> {}
@FunctionalInterface public interface KeyFactory<K> extends BaseFactory<K> { /** * 创建新的键值 * @return 新的键值 */ Key<K> create(); }
以下这个类是一个具体的整型键(Key<Integer>)的创建工厂类:
public class IntegerKeyFactory implements KeyFactory<Integer> { private int start = 0; public IntegerKeyFactory() {} public IntegerKeyFactory(int start) {this.start = start;} @Override public Key<Integer> create() { return () -> start++; } public static void main(String[] args) { IntegerKeyFactory factory = new IntegerKeyFactory(1); for (int index = 0; index < 10; index++) { System.out.println(factory.create().get()); } } }
执行结果如下:
1 2 3 4 5 6 7 8 9 10
由于想偷懒不写Key<K>接口的实现类,所以在IntegerKeyFactory中用了lambda表达式(return () -> start++;),但等到写完后并且添加了main方法测试后才反应过来:lambda表达式不能访问外部可以被修改的变量(如果变量是引用,引用的地址不能修改),可是因为写好后编译器没有报错,就尝试执行了下,发现可以正确运行,并且这个结果也是我期望的。
有哪位大神能告诉我这是不是个Bug?如果不是Bug,这个原理(lambda表达式修改了外部变量(int类型)的值)是什么?
start不是类内的私有属性?怎么成了外部变量?知道了,又学到了一点,类内部变量可以在lambda表达式中使用,区别于外部变量是类内部私有属性啊,但相对于lambda表达式不是外部变量吗?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。