📜  Java的有效最终变量与示例

📅  最后修改于: 2022-05-13 01:55:17.579000             🧑  作者: Mango

Java的有效最终变量与示例

final 变量是使用称为“final”的关键字声明的变量。

例子:

final int number;
number = 77;

Effectively Final 变量是一个局部变量,它遵循以下属性,如下所示:

  • 未定义为最终
  • 仅分配给一次。

任何局部变量或参数现在只分配一次(或仅更新一次)。它可能不会在整个程序中保持有效的最终状态。所以这表明有效的最终变量可能会在它被分配/更新至少另一个分配的时间后立即失去其有效的最终属性。此外,一个有效的 final 变量可能是一个值没有改变的变量,但它没有用 Ultimate 关键字声明。

int number;
number = 7;

例子:

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;
        };
    }
}

输出: