lambda: effectively final parameters: copy in final variable if needed - never make implicitly final

This commit is contained in:
Anna Kozlova
2012-08-21 14:39:41 +04:00
parent c85e90f7c1
commit a0d858fa5b
13 changed files with 126 additions and 27 deletions
@@ -90,4 +90,28 @@ class Sample {
runnable.run(); // prints 111
runnable2.run(); // prints 444
}
}
class ParameterIsEffectivelyFinal {
{
Comparable<String> c = o->{
new Runnable() {
@Override
public void run() {
System.out.println(o);
}
}.run();
return 0;
};
Comparable<String> c1 = o->{
o = "";
new Runnable() {
@Override
public void run() {
System.out.println(<error descr="Variable 'o' is accessed from within inner class. Needs to be declared final.">o</error>);
}
}.run();
return 0;
};
}
}
@@ -1,7 +1,7 @@
// "Replace with lambda" "true"
class Test {
{
Comparable<String> c = (o)->{
Comparable<String> c = o->{
return 0;
};
}
@@ -1,7 +1,7 @@
// "Replace with lambda" "true"
class Test {
{
Comparable<String> c = (final String o)->{
Comparable<String> c = o->{
Runnable r = new Runnable() {
@Override
public void run() {
@@ -0,0 +1,17 @@
// "Copy 'o' to temp final variable" "true"
class Test1 {
void foo(){}
{
Comparable<String> a = o->{
o = "";
final String finalO = o;
new Runnable() {
@Override
public void run() {
System.out.println(finalO);
}
}.run();
return 0;
};
}
}
@@ -0,0 +1,16 @@
// "Copy 'o' to temp final variable" "true"
class Test1 {
void foo(){}
{
Comparable<String> a = o->{
o = "";
new Runnable() {
@Override
public void run() {
System.out.println(<caret>o);
}
}.run();
return 0;
};
}
}