Java的有效最终变量与示例
final 变量是使用称为“final”的关键字声明的变量。
例子:
final int number;
number = 77;
Effectively Final 变量是一个局部变量,它遵循以下属性,如下所示:
- 未定义为最终
- 仅分配给一次。
任何局部变量或参数现在只分配一次(或仅更新一次)。它可能不会在整个程序中保持有效的最终状态。所以这表明有效的最终变量可能会在它被分配/更新至少另一个分配的时间后立即失去其有效的最终属性。此外,一个有效的 final 变量可能是一个值没有改变的变量,但它没有用 Ultimate 关键字声明。
int number;
number = 7;
Note: Final and Effective Final are similar but just that effective Final variables are not declared with Keyword final.
例子:
Java
// Java Program to Illustrate Effective Final Keyword
// Importing input output classes
import java.io.*;
// Main class
class GFG {
// Main friver method
public static void main(String[] args)
{
// Calling the method where custom operands
// are passed as parameters
calculateValue(124, 53);
}
// Method 2
// To calculate the value by passing operands as
// parameters
public static void calculateValue(int operand1,
int operand2)
{
// Operands and remainder are effectively final here
int rem = 0;
// Remainder lost its effectively final property
// here because it gets its second assignment
rem = operand1 % 5;
// Operands are still effectively final here
// Class 2
class operators {
// Method 1
void setNum()
{
// operand1 lost its effectively final
// property here because it gets its second
// assignment
operand1 = operand2 % 2;
}
// Method 2
int add()
{
// It does not compile because rem is not
// effectively final
return rem + operand2;
}
// Method 3
int multiply()
{
// It does not compile because both
// remainder and operand1 are not
// effectively final
return rem * operand1;
}
}
}
}
Java
// Java Program to Illustrate Effective Final Keyword
// Importing input output classes
import java.io.*;
// Defining an interface
@FunctionalInterface
interface IFuncInt {
// Method 1
int func(int num1, int num2);
public String toString();
}
// Main driver method
public class GFG {
// Main driver method
public static void main(String[] args)
{
int i = 7;
IFuncInt funcInt = (num1, num2) ->
{
// It produces an error due to effectively final
// variable not declared
i = num1 + num2;
return i;
};
}
}
输出:将按预期抛出错误,可以从终端输出中看出,如下所示:
Lambda 表达式捕获值
当 lambda 表达式使用其封闭空间中已分配的局部变量时,存在一个关键限制。一个 lambda 表达式只能使用一个其值不会改变的局部变量。该限制被称为“变量捕获”,描述为: lambda 表达式捕获值,而不是变量。
lambda 表达式可能使用的局部变量被称为“有效最终”。
一个有效的最终变量是一个值在第一次赋值后不会改变的变量。无需将此类变量显式声明为 final,尽管这样做不会出错。
实现:考虑到我们确实有一个区域变量,让它是 'i',它被初始化为 '7',在 lambda 表达式中,我们尝试通过为 i 分配一个新值来改变该值。这将以编译器错误结束——“我在封闭作用域中定义的局部变量必须是最终的或有效的最终变量”。
Java
// Java Program to Illustrate Effective Final Keyword
// Importing input output classes
import java.io.*;
// Defining an interface
@FunctionalInterface
interface IFuncInt {
// Method 1
int func(int num1, int num2);
public String toString();
}
// Main driver method
public class GFG {
// Main driver method
public static void main(String[] args)
{
int i = 7;
IFuncInt funcInt = (num1, num2) ->
{
// It produces an error due to effectively final
// variable not declared
i = num1 + num2;
return i;
};
}
}
输出: