java - 直接从类调用方法与创建类并调用方法有何不同?

标签 java memory

它们使用内存的方式是否存在差异?执行此操作时应考虑哪些情况?这是我的意思的一个例子。

// Calling a method directly
if(a) {
   new MyClass().method1();
} else if(b) {
   new MyClass().method2();
} else if(c) {
   new MyClass().method3();
}

反对以下内容

MyClass mc = new MyClass();
if(a) {
   mc.method1();
} else if(b) {
   mc.method2();
} else if(c) {
   mc.method3();
}

最佳答案

有一点细微的差别。

在第一种情况下,实例的作用域为每个条件 block ,并且一旦 block 结束就有资格进行垃圾回收 - 只会执行一个 block 。

在第二种情况下,实例的作用域为外部 block ,并且一旦外部 block 结束就可以进行垃圾回收。

在任何一种情况下,都只会创建该类的一个实例,尽管在第一个示例中考虑到缺乏安全网 else 情况,您最终可能根本不会创建任何实例(感谢@Nexevis) )。

当然,这不包括类的构造函数、初始化 block 或方法实现中可能存在的泄漏或依赖关系——在给定的上下文中这是不可能知道的。

此外,也无法得知外部 block 的作用,例如将该实例返回给调用者等。

关于java - 直接从类调用方法与创建类并调用方法有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58030303/

相关文章:

java - 在两个jsp文件之间传递值

c - 为什么在 BSS 和数据段中将不同大小的内存分配给整数?

c - 在以下情况下,哪个更好? fread() 还是 mmap()?

python - 为什么连接字符串比连接它们运行得更快?

c++ - 为什么 std::unordered_map 有保留方法?

java - 如何捕获 ConversionFailedException?

java - 使用 Java 检索 MongoDb 嵌套文档的所有键

使用 lambda 的 Java 控制台菜单

java - Struts "org.apache.struts.action.RequestProcessor - Unhandled Exception thrown"- 如何获取完整的堆栈跟踪?

c - 什么时候函数会加载到内存中?