Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 声明变量final v。延迟实例化_Java_Design Patterns_Final - Fatal编程技术网

Java 声明变量final v。延迟实例化

Java 声明变量final v。延迟实例化,java,design-patterns,final,Java,Design Patterns,Final,延迟实例化 public class Foo{ private NotSoExpensiveObject o; public NotSoExpensiveObject getNSEObject(){ if(o == null){ o = new NotSoExpensiveObject(); } return o; } } 宣布最终 public class Foo{ private fi

延迟实例化

public class Foo{
    private NotSoExpensiveObject o;

    public NotSoExpensiveObject getNSEObject(){
        if(o == null){
            o = new NotSoExpensiveObject();
        }
        return o;
    }
}
宣布最终

public class Foo{
    private final NotSoExpensiveObject o;

    public Foo(){
        o = new NotSoExpensiveObject();
    }
}
声明
NotSoExpensiveObject
final是否比延迟其实例化有任何优势?还是这纯粹是一种情境?还有,有没有办法延迟实例化,并保留
final
修饰符

谢谢

声明NotSoExpensiveObject 决赛比拖延有什么好处 它的实例化?还是纯粹是这样 情境的?肌萎缩侧索硬化

final
将使其保持不变,不可修改(即
CONST
相当于C,一旦赋值,就不能更改值)。它与惰性初始化无关

有没有办法延迟实例化并保留最后的修饰符


可能您看到这段代码的地方不希望值不可修改,因此
final

final只是一个编译时限制,因此final成员在声明或在构造函数中时必须内联初始化。当不同的构造函数需要以不同的方式初始化最终成员时,“延迟的”final很好

延迟实例化可能不是线程安全的,除非您进行同步。

您的Foo类是从不同的线程使用的吗?如果是,则需要将同步添加到延迟初始化解决方案中。如果使用“最终”变体,则不必执行此操作。在这种情况下,JVM保证对NoSoExpensiveObject的引用对其他线程可见


也没有办法保留最后一个修饰符,仍然使用延迟初始化。最终成员需要立即初始化或通过构造函数初始化。

在不可修改的点上,您可能要小心。它可以解释为一个可变对象不知何故变得不可修改。@Andrew谢谢,添加了更多信息你所说的“延迟”最终结果是什么意思?当我延迟其实例化时,我不能声明
NotSoExpensiveObject
final,尽管它基本上保证由
Foo
的每个实例初始化一次。我想我真正好奇的是,给变量指定
final
修饰符是否有任何性能好处……可能没有。延迟是指将值分配给构造函数中的最终成员,而不是成员。final的不同用法在性能上存在差异,但如果使用final,性能可能会略有提高。我认为这仅适用于局部变量,您可以检查Modifier.isFinal(myField)。我记得读过一篇文章,声明类变量final会影响它们的初始化方式,这会影响同步吗?