这是最后的讨论!

Pun打算……让我们讨论Java final

最近,我们广受欢迎的博客文章“编码Java时的十个微妙的最佳实践”在JavaWorld的摘要和链接中有了很大的复兴,并提出了一组新的评论。 尤其是,JavaWorld编辑对我们对Java关键字“ final ”的观点提出了质疑:



更有争议的是,Eder提出了默认情况下使方法最终化是否安全的问题:

“如果您完全控制所有源代码,则默认情况下将方法定为final绝对没有问题,因为:”

  • “如果确实需要重写方法(真的吗?),您仍然可以删除final关键字”
  • “您再也不会意外覆盖任何方法了”

确实是的。 默认情况下,所有类,方法,字段和局部变量都应为final,并且可以通过关键字进行更改。

以下是字段和局部变量:

int finalInt   = 1;
val int finalInt   = 2;
var int mutableInt = 3;

是否确实需要使用Scala / C#样式的val关键字仍有待商.。 但是很显然,为了再次修改字段/变量,我们应该有一个明确允许它的关键字。 方法相同–我使用Java 8的default关键字来提高一致性和规则性:

class FinalClass {void finalMethod() {}
}default class ExtendableClass {void finalMethod      () {}default void overridableMethod() {}
}

在我们看来,那将是一个完美的世界,但是Java却采取了另一种方式,将default (可覆盖,可变)默认和final (不可覆盖,不可变)显式选项。

公平地说,我们会忍受的

…作为API设计人员(当然来自jOOQ API),我们会很乐意将final放在final ,至少假装Java具有上述更明智的默认值。

但是许多人不同意这种评估,主要原因是:

作为主要在osgi环境中工作的人,我不能完全同意,但是您可以保证其他api设计人员也有同样的感觉吗? 我认为最好是先限制api设计人员的错误,而不是先限制用户可以默认扩展的范围,以取代用户的错误。 – eliasv在reddit上

要么…

强烈反对。 我宁愿从公共图书馆禁止final和private。 当我真的需要扩展某些东西而无法完成时,这是一种痛苦。

故意锁定代码可能意味着两件事,要么糟透了,要么完美。 但是,如果它是完美的,那么没有人需要对其进行扩展,那么为什么要关心它。

当然,存在使用final的正当理由,但是担心用新版本的库破坏某人并不是其中之一。 – 在reddit上的meotau

还是...

我知道我们已经对此进行了非常有用的讨论,但只是在此线程上提醒其他人:关于“最终”的许多争论都取决于上下文:这是公共API还是内部代码? 在前一种情况下,我同意有一些很好的论据可以说是最终的。 在后一种情况下,最终几乎总是一个糟糕的主意。 – Charles Roth在我们的博客上

所有这些论点都倾向于朝一个方向发展:“我们正在开发糟糕的代码,因此我们至少需要一些解决方法来减轻这种痛苦。”

但是为什么不这样想呢:

以上所有人员都想到的API设计人员将精确创建您想通过扩展进行修补的可怕API。 碰巧的是,除非Java语言要求,否则相同的API设计人员不会考虑关键字final的有用性和可通信性,因此永远不会使用它。 双赢(尽管糟糕的API,不稳定的解决方法和补丁程序)。

希望将final用于其API的API设计人员将在如何正确设计API(以及定义明确的扩展点/ SPI)方面反映出很多内容,从而使您永远不必担心final是什么。 同样,双赢(和一个很棒的API)。

此外,在后一种情况下,奇怪的黑客将不会被黑客入侵和破坏您的API,而这只会导致痛苦和痛苦,但这并不是真正的损失。

最终界面方法

由于上述原因,我仍然深感遗憾,Java 8接口中的final是不可能的。 布莱恩·格茨(Brian Goetz)做出了出色的解释,为什么如此决定。 实际上,是通常的解释。 关于这一点不是改变的主要设计目标!

但是,如果我们有以下条件,请考虑语言的一致性和规律性:

default interface ImplementableInterface {void abstractMethod   () ;void finalMethod      () {}default void overridableMethod() {}
}

(鸭子和奔跑…)

或者,更现实地说,我们的默认值为default

interface ImplementableInterface {void abstractMethod   () ;final void finalMethod      () {}void overridableMethod() {}
}

最后

那么,您对此讨论的最终想法是什么?

如果您还没听够,请考虑同时阅读 Whiley编程语言作者David Pearce博士的 这篇出色文章 。

翻译自: https://www.javacodegeeks.com/2014/09/this-is-the-final-discussion.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端性能优化方法总结

一个网站前端性能的好坏很大程度上影响了用户愿不愿意使用访问这个网站,因此对前端进行性能优化是个很重要的事情。  对于前端性能优化这个问题,主要学习自yahoo前端性能团队总结的35条黄金定律总结,觉得很全很赞,做个学习总结和…

JS中的数据类型转换

ES5中一共有6种数据类型,其中5种基本类型(String、Number、Boolean、Null、Undefined),1种引用类型(Object)。基本类型值可以相互换转换,并且引用类型值也可以通过某种方式转换成基本类型值。 …

拯救我的操作系统

最近公司新装操作系统image都强制装win7,公司电脑一直拖着没有升级,家里也一直是用番茄花园版的xp,突然心血来潮去买了个win7的碟,心想最好是破解版的,回来一装,发现是所谓的旗舰版的,可恶的是这…

Hazelcast的MapLoader陷阱

Hazelcast提供的核心数据结构之一是IMap<K, V> &#xff0c;它扩展了java.util.concurrent.ConcurrentMap它基本上是一个分布式地图&#xff0c;通常用作缓存。 您可以将此类地图配置为使用自定义MapLoader<K, V> -每次尝试从该地图&#xff08;通过键&#xff09;…

《Android开发从零开始》——22.数据存储(1)

本节课的主要内容有&#xff1a;1.介绍Android中数据存储方式2.介绍SQLite3.讲解SQLite数据类型4.讲解基本SQL命令 课程下载地址&#xff1a;http://u.115.com/file/clc4te8w课件及源码下载地址&#xff1a;http://u.115.com/file/clc41tt5转载于:https://www.cnblogs.com/cool…

计划Java EE 7批处理作业

Java EE 7添加了使用JSR 352以标准方式执行批处理作业的功能。 <job id"myJob" xmlns"http://xmlns.jcp.org/xml/ns/javaee" version"1.0"><step id"myStep"><chunk item-count"3"><reader ref"…

webpack配置说明

webpack是一个现代JavaScript应用程序的静态模块打包器。 它有几个核心概念&#xff1a; 一、entry&#xff08;入口&#xff09; 指示webpack应该使用哪个模块&#xff0c;来作为构建其内部依赖图的开始&#xff0c; 可以在webpack.config.js中配置entry属性&#xff0c;来指…

poj 2137

题目大意&#xff1a; 农夫FJ想把他所有的牛在它们吃草的时候用一根绳子连起来&#xff08;就是1-2-3-1按顺序连接起来&#xff09;&#xff0c;每头牛有若干个吃草的位置&#xff0c;它们必须要在这些位置吃草。 用绳子连接两头牛需要绳子的长度公式为 Sqrt( Sqr( x1-x2 ) Sq…

JS中捉摸不透的==(宽松等于)

首先来看一个有意思的面试题&#xff1a; if(a 3 && a 4){//... }第一眼看到这个面试题我是拒绝的&#xff0c;这个等式根本不会成立&#xff0c;怎么会存在一个值既等于3并且还同时等于4呢&#xff1f;根本不可能。 但是在神奇的javascript中这个a是存在的。&…

vue脚手架的使用

安装&#xff1a;1.全局安装脚手架&#xff1a;cnpm install -g vue/cli 使用&#xff1a;2.新建文件夹,在当前目录执行命令 vue create "项目名称"3.配置&#xff1a;选择Manually select feautures--》空格选择Babel和CSS Pre-procesors--》选择Sass/SCSS(with dar…

Akka笔记–演员介绍

过去做过多线程的任何人都不会否认管理多线程应用程序有多么艰辛和痛苦。 我说管理是因为它一开始很简单&#xff0c;一旦您开始看到性能改进&#xff0c;它就会变得非常有趣。 但是&#xff0c;当您发现没有一种简单的方法可以从子任务中的错误或难以发现的僵尸错误中恢复时&a…

浏览器的同源策略与跨域

本文所有案例在本地址都可找到&#xff1a;https://github.com/dancingZhou/sameOrigin/tree/dev 什么是同源策略 两个页面地址中的协议、域名和端口号一致&#xff0c;则表示同源。 例如该地址 https://www.google.com 和以下地址对比 地址同源原因http://www.google.com否…

poj 1185

经典状态dp 代码&#xff1a; #include<iostream> #include<fstream> #include<cmath>using namespace std;int n,m;char map[101][11];int state[101][1024]; int num[101]; int value[1024]; int maxx;int ok(int s,int t){int i,j,k;for(i0;i<m;){jt&…

day03 爬虫

今日内容&#xff1a;一 爬虫原理二 Requests请求库一 爬虫原理1.什么是互联网&#xff1f;指的是由一堆网络设备&#xff0c;把一台台的计算机互联网到一起称之为互联网。2.互联网建立的目的&#xff1f;互联网建立的目的是为了数据的传递以及数据的共享。3.什么是数据&#x…

Java英雄:丹·艾伦

“ Java英雄 ”系列休息了很长时间。 老实说&#xff0c;我想即使有很多人想在这里收录&#xff0c;它也可能会以虚无收场。 其中之一是丹。 我第一次要求他捐款已经将近一年半了&#xff0c;与此同时发生的一切&#xff0c;让我不再有任何答案就让我安心了。 但是以下内容在Ja…

yearProgress.vue

1 <template>2 <div class"progressbar">3 <el-progress :text-inside"true" :soke-width"18" :percentage"percent" status"exception"></el-progress>4 <p>{{year}}年已经过去了…

group by rollup

首先引用ITPUB上的总结&#xff1a; rollup(a,b,c)----------------> 从右到底递减汇总>group by a,b,c (减0次)UNION ALL>group by a,b (减1次)UNION ALL>group by a (减2次)UNION ALL>group by null(全部汇总) (全部减掉)移动了4次&#xff0c;所…

Java-Class-I:java.util.List

ylbtech-Java-Class-I&#xff1a;java.util.List1.返回顶部 1.1、import java.util.ArrayList;import java.util.List; 1.2、List<Integer> newList new ArrayList<Integer>();newList.add(3); 2、 2.返回顶部1.1、import java.util.*;public class Test{public …

JS中编码的三种方法

在开发中经常需要对用户输入的数据进行编码然后才能通过HTTP请求发送给后台&#xff0c;或者对传递过来的数据进行解码。在JS中原生提供了三种编码/解码方式&#xff0c;分别是 encodeURI、 encodeURIComponent和 escape。 为什么URL需要编码&#xff1f; URI设计要求可移植&…

一个类加载的谜团解决了

面对一个好老问题 我在应用程序服务器上遇到一些类加载问题。 这些库被定义为Maven依赖项&#xff0c;因此被打包到WAR和EAR文件中。 不幸的是&#xff0c;其中一些也已安装到应用程序服务器中&#xff0c;但版本不同。 启动应用程序时&#xff0c;我们遇到了与这些类型的问题相…