首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Java规范的创建者没有像构造函数一样强制终结器链接?

Java规范的创建者没有像构造函数一样强制终结器链接的原因是为了提高代码的灵活性和可维护性。

在Java中,构造函数用于创建对象并初始化其状态。它们在对象创建时自动调用,并且在对象的生命周期中只会被调用一次。这种设计确保了对象的正确初始化,并且可以在构造函数中执行必要的资源分配和初始化操作。

相比之下,终结器(Finalizer)是Java中一种特殊的方法,用于在对象被垃圾回收器回收之前执行一些清理操作。终结器的调用是由垃圾回收器自动触发的,而不是由程序员显式调用。然而,终结器的使用存在一些问题和限制:

  1. 不确定性:终结器的调用时机是不确定的,取决于垃圾回收器的工作方式和系统资源的可用性。这导致了无法准确控制清理操作的执行时间和顺序。
  2. 性能影响:终结器的调用会导致额外的开销和延迟,因为垃圾回收器需要额外的工作来检测和调用终结器。这可能会影响应用程序的性能和响应时间。
  3. 可靠性问题:由于终结器的调用是不确定的,无法保证它们一定会被执行。这可能导致资源泄漏或其他不可预测的行为。

基于以上问题,Java规范的创建者决定不像构造函数一样强制终结器链接。相反,Java提供了更可靠和灵活的资源管理机制,即使用try-with-resources语句或手动调用close()方法来显式释放资源。这种方式可以确保资源的及时释放,并且可以在代码中明确控制资源的生命周期。

总结起来,Java规范的创建者没有强制终结器链接是为了避免不确定性、性能问题和可靠性问题,同时提倡使用更可靠和灵活的资源管理机制来确保代码的可维护性和可靠性。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Effective-java-读书笔记之创建和销毁对象

(鼓励程序员: 组合优于继承).不容易被程序员发现, 因为静态工厂方法与其他静态方法没有区别. 在API文档中没有构造一样明确标识出来....对于单例来说, 该方法没有参数, 返回唯一实例.create或newInstance: getInstance一样, 但newInstance能确保返回每个实例都与其他实例不同.getType:....通过做成抽象类来强制该类不可被实例化, 这是行不通, 因为可能会造成"这个类是用来被继承"误解, 而继承它子类又可以被实例化.所以只要让这个类包含一个私有的构造, 它就不能被实例化了....使用终结方法会导致行为不稳定, 降低性能, 以及可移植性问题.Java 9废弃了finalizers, 取而代之是清理 -> cleaners. cleaners虽然没有finalizers那么危险...Java语言规范不仅不保证终结方法会被及时地执行, 而且根本就不保证它们会被执行. 所以不应该依赖于终结方法来更新重要持久状态.

37200

Chicory:编写WebAssembly克服JVM缺陷

这将开发人员置于操作系统角色。模块可以通过在字节码格式中列出“导入”函数来请求功能。此导入可以使用用 Java 编写宿主函数来实现。无论模块语言是什么,模块都可以在需要时调用此 Java 函数。...宿主函数可以被认为是系统调用或语言标准库,但宿主函数是在 Java 中确定和实现,Eckel 说。 Eckel 指出,如果链接到 JVM 中原生对象,则必须将该对象与应用程序或库一起提供。...这就是 Java 强大地方。Peruffo 指出,这样企业应用程序不容易替换,因此目标是赋予它们权力,使它们使用更加灵活。...在 Keycloak 中,如果需要自定义操作,例如根据不同提供商检查用户身份或插入自定义业务规则,通常需要编写 Java 插件,Peruffo 继续说道。但为什么要将开发限制在 Java 上?...项目创建者表示,提前编译已投入生产,并且已被证明比解释模式快得多。 设置 虽然我还没有能够在我 Windows 笔记本电脑上加载和运行 Chicory,但请继续关注有关如何设置和运行它评论。

5710

Java对象初始化顺序

事实证明,虽然这种微小变化显然不会以任何方式改变代码行为,但是却让结果变不同。 那么,到底发生了什么?当查看初始化顺序时候一切就变清晰了: 1.main() 函数调用了 Lower 构造。...3.父类构造被调用了。这是被语言特性所强制执行。所以在其他任何事发生之前,Upper 构造被调用了。...7.现在变得有趣了:Lower 实例构造在继续。假设在 lowerString 字段声明中没有明确地 =null 赋值,Lower 构造恢复执行并且打印出两个连接到字段字符串。...然而,如果有一个明确地赋值 null 操作,执行流程会略有不同:当父类构造完成后,在其余构造运行前,任何变量初始化都会执行(参见java语言规范12.5节)。...这是一个很好例子,不仅方便我们如何注意一些创建对象细节(或者知道去哪里查看 Java 编码规范,打印或者在线),还显示了为什么这样写初始化是很糟糕

71010

Java高频面试题----面向对象篇

如果我们重载了一个构造函数,那么必须实现这个默认构造函数。 5. 为什么Java类中需要默认构造? 答:如果没有其他构造定义的话,Java类默认构造都是自动创建无参构造。...Java规范声明,如果类中没有重载构造函数,它将提供一个默认构造函数。但这并没有说明在类中编写重载构造函数情况。...但是它需要按照规范默认构造函数。 6. Java构造返回值是什么? 答:当我们用Java调用构造函数时,它返回由它创建对象。这就是我们用Java创建新对象方式。 7....因此,没有必要标记构造函数为static。 5. 为什么Java类中需要默认构造? 如果没有定义其他构造函数,则默认构造函数Java会自动生成无参构造函数。...根据Java规范,如果类中没有重载构造函数,它将提供一个默认构造函数。但这并没有说明在类中编写重载构造函数情况。 我们至少需要一个构造函数来创建一个对象,这就是Java提供默认构造函数原因。

38041

Java泛型详解:和Class使用。泛型类,泛型方法详细使用实例

参考链接Javamain()函数强制吗 一、引入  1、泛型是什么  首先告诉大家ArrayList就是泛型。那ArrayList能完成哪些想不到功能呢?...………   }    看到了吧,跟我们Point实现是一样,这也就是为什么ArrayList能够盛装各种类型主要原因。...而不是Object实现方式一样,在运行时才会报强制转换错误。   2、多泛型变量定义及字母规范  (1)、多泛型变量定义 上在我们只定义了一个泛型变量T,那如果我们需要传进去多个泛型要怎么办呢?...StaticMethod("adfdsa");//使用方法二    从结果中我们可以看到,这两种方法结果是完全一样,但他们还有些区别的,区别如下: 方法一,可以普通方法一样,直接传值...方法一,隐式传递了T类型,与上面一样,不建议这么做。 方法二,显示将T赋值为Integer类型,这样OtherMethod(T a)传递过来参数如果不是Integer那么编译就会报错。

3.2K50

.NET Core.NET 5.0 析构函数依然有效?

.NET Framework中一个很标准资源释放例子,这里我以4.7.2版本为例(其他版本一样)。...析构函数本质是终结,如果对象已被释放,在合适时机将自动调用Finalize方法,除非我们手动通过GC来抑制调用终结(GC.SuppressFinalize),但不建议手动调用Finalize方法 通过资源释放标准例子...Core中不会在应用程序终止时运行终结(针对可到达或不可到达对象),根据建议,并不能保证所有可终结对象在关闭之前都将被终结。...由于上述链接原因存在,所以在ECMAC#5.0规范削弱了这一要求,因此.Net Core并不会违反此版本规范 总结 在应用程序关闭前,.NET Framework会尽一切合理努力调用析构函数终结进行资源清理...,但在.NET Core中并不能保证此行为,所以在ECMA 语言规范中削弱了这一要求 基于上述,在.NET Core中使用析构函数没有实质性意义

30520

Java面试基本问题

而且,它没有返回类型,并且在创建对象时会自动调用它。 有两种类型构造函数: 默认构造函数:在Java中,默认构造函数是不接受任何输入构造函数。...例如:方法可以String类一样被覆盖。equals()方法用于比较两个对象值。 Q10。Java堆和堆栈内存有何区别?...方法 构造函数 1.用于表示对象行为 1.用于初始化对象状态 2.必须具有返回类型 2.没有任何退货类型 3.需要显式调用 3.隐式调用 4.编译未提供默认方法 4.如果该类没有默认构造函数,则由编译提供...什么是Java构造函数链接? 在Java中,构造函数链接是相对于当前对象从另一个构造函数调用一个构造函数过程。构造链接只有通过继承才能实现,在传统中,子类构造负责首先调用超类构造。...构造函数链中可以有任意多个类。构造链接可以通过两种方式实现: 在同一类中使用this() 从基类使用super() Q28。

1.1K20

Java基础知识 1】Java入门级概述

八、Java重要概念 1、类 类创建者负责在创建新类时,只暴露必要接口给客户程序员,同时隐藏其它所有不必要信息。 为什么这么做呢?...11、super与this super关键字可以在子类构造方法中显示地调用父类构造方法,super()必须为子类构造函数第一行。...但是, 重写方法不能抛出新强制性异常,或者比被重写方法声明更广泛强制性 异常,反之则可以。 13、在 Java 中,什么时候用重载,什么时候用重写?...对象在没有引用变量指向它时候,才会编程垃圾,不能再被使用,但是仍然占着内存,在随后一个不确定时间点被垃圾回收释放掉。...equals时候将字符串常量写在前面 请知道,在java中if (i == 1)和if (1 == i)是没有区别的,但从阅读习惯上讲,建议使用前者 不要对数组使用toString方法 不要对超出范围基础数据类型做向下强制类型转型

45010

只因多看了一眼提示,又一次刷新了@Autowired注释认知

@Autowired和@Resource都可以用于来实现依赖注入,但前者是Spring提供,后者为JDK(JSR-250标准)自带。阿里Java开发规范中推荐使用@Resource。...翻译过来就是:字段注入是不推荐,Spring团队建议:“始终在bean中使用基于构造函数依赖项注入。始终对强制性依赖项使用断言”。...Spring注入方式及场景 Spring常见DI方式:构造注入、Setter注入、字段注入。显然,我们经常使用方式并不是官方最推荐。...Field注入缺点 Field注入缺点很明显,比如不能构造注入那样注入不可变对象,依赖对外部不可见(构造和Setter可见,而private属性不可见),会导致组件与IoC容器(比如Spring...既然Field注入这么多缺点,但为什么大家还是习惯使用呢?主要原因:太方便了,极大缩减了代码。而且大多数业务并不需要用构造强绑定,同时换IoC容器可能性也极低。

86220

箭头函数意义和函数二义性

)来获取所有参数值箭头函数没有 prototype 原型,不能用作构造函数,而普通函数可以更加简洁函数语法相信一名前端开发者,对于这两者区别,多多少少都能罗列一些,但是你们有没有想过,JS已经有普通函数了...因为函数二义性,导致 JS 函数复杂度直线上升,因为函数在创建时候,创建者不知道未来调用者如何调用,可能直接调用,也有可能通过 new 方法调用,这就会存在很大安全隐患。...后来开发者就在函数命名上定义了一套规范,普通函数首字母小写,构造函数首字母大写,就像下面这样:// 普通函数function user(){};// 构造函数function User(){};但毕竟这个不是强约制性...,普通函数依旧可以使用 new 调用,这只能说在一定程度上稍微缓解了这个问题,就像 JS 一些构造函数一样,两种调用方式都可以,比如:// NumberNumber();new Number()//...this 来自于面向对象里面的概念,箭头函数里面没有原型概念是一样

12710

Python入门知识点汇总

缩进 Python开发者有意让违反了缩进规则程序不能通过编译,以此来强制程序员养成良好编程习惯。...这里self相当于C++, Java里面的this变量,但是我们还可以使用任何其它合法参数名,比如this 和 mine 等,self与C++,Java里面的this不完全一样,它可以被看作是一个习惯性用法...Python禁止没有明确定义操作,比如数字加字符串。 与其它面向对象语言一样,Python允许程序员定义类型。...构造一个对象只需要函数一样调用类型即可,比如,对于前面定义Fish类型,使用Fish()。...比如7 // 3结果是2,而(-7) // 3结果却是-3。这个算法与其它很多编程语言不一样,需要注意,它们整除运算会向0方向取值。 Python允许数学常用写法那样连着写两个比较运行符。

1.1K10

【1】进大厂必须掌握面试题-Java面试-基础

而且,它没有返回类型,并且在创建对象时会自动调用它。 有两种类型构造函数: 默认构造函数:在Java中,默认构造函数是不接受任何输入构造函数。...例如:方法可以String类一样被覆盖。equals()方法用于比较两个对象值。 Q10。Java堆和堆栈内存有何区别?...方法 构造函数 1.用于表示对象行为 1.用于初始化对象状态 2.必须具有返回类型 2.没有任何退货类型 3.需要显式调用 3.隐式调用 4.编译未提供默认方法 4.如果该类没有默认构造函数,则由编译提供...什么是Java构造函数链接? 在Java中,构造函数链接是相对于当前对象从另一个构造函数调用一个构造函数过程。构造链接只有通过继承才能实现,在传统中,子类构造负责首先调用超类构造。...构造函数链中可以有任意多个类。构造链接可以通过两种方式实现: 在同一类中使用this() 从基类使用super() Q28。

1.7K00

Java面试基本问题

而且,它没有返回类型,并且在创建对象时会自动调用它。 有两种类型构造函数: 默认构造函数:在Java中,默认构造函数是不接受任何输入构造函数。...例如:方法可以String类一样被覆盖。equals()方法用于比较两个对象值。 Q10。Java堆和堆栈内存有何区别?...方法 构造函数 1.用于表示对象行为 1.用于初始化对象状态 2.必须具有返回类型 2.没有任何退货类型 3.需要显式调用 3.隐式调用 4.编译未提供默认方法 4.如果该类没有默认构造函数,则由编译提供...什么是Java构造函数链接? 在Java中,构造函数链接是相对于当前对象从另一个构造函数调用一个构造函数过程。构造链接只有通过继承才能实现,在传统中,子类构造负责首先调用超类构造。...构造函数链中可以有任意多个类。构造链接可以通过两种方式实现: 在同一类中使用this() 从基类使用super() Q28。

1.1K50

scala语言会取代Java吗?

特别是与主流面向对象语言,如Java和C#尽量无缝交互。Scala有Java和C#一样编译模型(独立编译,动态装载类),允许访问成千上万高质量类库。...我们可以利用Scalaactor模型在JVM上设计具伸缩性并发应用程序,以自动获得多核心处理带来优势,而不必依照复杂Java线程模型来编写程序。...Scala结合了面向对象和函数编程优势,函数编程一个好处就是你能够运用一个数据那样运用函数,可以用来定义真正高层级库,或者去定义新领域特殊语言(DSL)。...Java 拥有非常强概念规范,因此任何一个 Java 程序之间具有非常多相似之处,并且这样能够方便进行程序员交替。但是 Scala 并没有这样统一性,因为这是一门很有表现力语言。...正如JRuby 创建者之一Charles Nutter 所宣称那样Scala就是 Java 王位合法继承人。

1.9K60

C#语言和JAVA、C++对比学习

下面我们就来看看C#有哪些好玩特性: 首先我发现C#命名规范比较特别,他使用是Camel形式单词拼写,但是又没有Java首字母小写规则。这点其实更加Google建议C++编码规范。...除了用来构造对象,还可以用来隐藏基类被继承成员,同时也可以用来在泛型使用中约束模板中参数必须带有公共无参数构造——这点在JAVA里面也是靠所谓JavaBean规范来约定,而C#则直接提供了语言支持...JAVA构造函数继承一直是一个笑话,因为如果你在子类构造函数中,调用了父类某个特殊形态构造函数,这个调用实际上不是在你代码所在地方运行!这简直是对程序代码欺骗。...C++用构造函数列表方式,来明确表明构造过程,是比较清楚。所以C#回到了C++这个优良传统上,真不知JAVA设计者为啥要把这个特性简化成现在这个可笑样子。...C++模板没有泛型约束语法,这样导致写模板函数时候有点碰运气,靠编译检查来约束,而且还不能确定其真正语意。

1.8K40

“面向对象就是一个错误!”

1 前言 C++和 Java 可能是计算机科学领域最大错误。就连面向对象创建者 Alan Kay 都曾对这两门语言提出了严厉批评。然而,C++和 Java 都是比较主流面向对象语言。...一个人可以精通各种面向对象编程最佳实践,例如依赖注入、测试驱动开发、领域驱动设计等(这些实践确实有帮助)。但是,这些都不是由编程范例本身来强制执行(而且也没有相应工具来强制执行最佳实践)。...突然间,函数结果就不可预测了!第一次运行没有问题,但是后面每次运行得到结果都是不可预测。换句话说,这个函数不再具备确定性。 为什么突然变成不确定?...我们希望软件也能够医学一样,找到坚实基础。 11 坚实基础 在编程世界中,我们也可以拥有数学一样可靠基础吗?可以!...从理论上讲,这类最佳实践有助于改善面条式代码。然而,这只是“最佳实践”,面向对象编程范例本身没有任何约束,强制人们遵守这类最佳实践。

45840

框架设计原则和规范(完)

要为所有聚合组件提供默认构造函数或非常简单构造函数 H.要为聚合组件提供可读写属性来与构造函数所有参数相对应 I. 要在聚合组件中使用事件,不要使用基于委托API J....每次继承,父类字段都被继承,这样,继承树低端对象不可避免膨胀。 大多数字段并没有被修改,一直保持着构造默认值,可否把这些字段从对象中剥离开来,减少对象体积。...依赖属性强制赋值 a) 不要再依赖属性访问中实现属性强制赋值逻辑,而应该向PropertyMetadata注册强制赋值回到函数 4....考虑创建一个用于紧急情况终结对象——如果终结方法在应用程序域被强制卸载或线程异常退出情况下都务必执行。 5....Factory模式 1) 要优先使用构造函数,而不是优先使用工厂,构造函数更容易使用,更一致,更方便 2) 如果构造函数提供对象创建机制不能满足要求,才考虑使用工厂 3) 如果开发人员可能不清楚待创建对象的确切类型

96240

@Autowired注解你真的会用吗?Spring官方有话说:Always use constructor based dependency injection in your beans

和阿里编码规范推荐似的,Spring团队推荐又来了:总是在您bean中使用构造函数建立依赖注入。总是使用断言强制依赖”。 直接alt+enter写成这样子 ? 好了,终于没大波浪了。...因为Java类会先执行构造方法,然后再给注解了@Autowired user注入值。...Java变量初始化顺序:静态变量或静态语句块–>实例变量或初始化语句块–>构造方法–>@Autowired 所以在执行构造方法时,就会报错。...解决方案 通过构造方法注入 ? 使用构造方法注入,可以明确成员变量加载顺序。 可细心地程序员不止于此,还有个问题 为什么要加final?...可能是为了防止,在程序运行时候,又执行了一遍构造函数; 或者是更容易让人理解意思,加上final只会在程序启动时候初始化一次,并且在程序运行时候不会再改变。

2K31
领券