请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

抗战之军工元帅 一个Java方法能有多少个参数类型?这个好奇coder做了个实验王牌梦魇

[复制链接]
查看: 637|回复: 0

2116

主题

1万

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
14376
发表于 2019-6-11 14:23 | 显示全部楼层 |阅读模式
这是写在帖子头部的内容
在 JVM 中,一个 Java 方式,最多能界说几多参数呢?这是一个很无聊的题目,即使能界说一万个,十万个,谁又会真的去这么做呢。可是作为一个 coder,最重要的不就是猎奇心吗,没有猎奇心,和一条咸鱼又有什么区分呢?本文作者就是这样一位布满猎奇心的 coder。


我比来给我的 QuickTheories 分支增加了一个接口:

DXCPICKPRE_0</pre>让我猎奇的是这个方式能有几多个范例参数。到今朝为止,我敢说,Java 说话标准并没有谈及这个题目。
对于实现界说的限制能够是什么,我有两个猜测:

  • 编译器会设备一个可猜测的限制,如 255 或 65535。
  • 编译器的告急行为会由于实现细节(仓库溢出或一样不成猜测/不相关的工具)而设备意外的限制。
我不想在源代码上测试我那点不幸的 C++技能,所以我决议只测试编译器做了什么。我写了一个 Python 剧本,它利用二进制搜索找到最少的致错范例参数。完整的剧本放在 Github repo (https://github.com/hyperpape/java-max-type-params) 中。
脚当地址:https://github.com/hyperpape/java-max-type-params
天生方式很简单。荣幸的是,我们不必利用任何范例参数,只需以<a,b,c…>的形式发出它们:

DXCPICKPRE_1</pre>运转二进制搜索可以获得以下输出:

DXCPICKPRE_2</pre>这个毛病有点模糊,但事后看来是可以预见的。编译器天生的类文件包括很多字符串,包括类中每个方式的方式签名。这些字符串存储在常量池中,常量池中的条目最大为 65535 字节,这是由 JVM 标准规定的限制。
所以,我之前的猜测都不完全正确。范例参数的最大数目是一个突现特征(emergent property),而不是一个明白的决议。不外,并不是编译器自己的实现致使了毛病。
相反,JVM 的类文件格式限制了可以在类文件中暗示的范例参数的数目。这是真的,虽然 JVM 对泛型一无所知。这也意味着范例参数的最大数目完全取决于若何编写方式。
我尝试了一种新的编码范例参数的方式(先前链接文件中的 write_Type_Compact),利用完整的正当 ASCII 字符(A-Z、a-z、$和_)。该实现有点过于复杂,由于可以利用字符 0~9,但不能是标识符的初始字符,由于 Java 关键字不能作为范例参数出现。我只是用等长的 UTF-8 字符替换了短单词「if」和「do」。更松散的编码将参数数目从 2776 增加到 3123。
不方便的是,_A 是一种正当的 Java 标识符,但 _ 不是。谢天谢地,我的编码在不利用初始_情况下就天生了 3392 个 2 字节范例参数,是以我感觉没有需要停止簿记以发出初始字符_。
再来一个小技能
解压类文件显现,65536 个字符的大部分不是我天生的范例参数,而是子字符串 Ljava/lang/object 的反复实例。由于没有供给关于范例参数的信息,所以类文件显现它们扩大了工具,并在方式签名中对其停止编码。我点窜了天生器来处理这个题目。
循环的关键部分是:

DXCPICKPRE_3</pre>在范例参数中,除了一个实例 java/Lang/Object 之外的一切实例都被替换为 A。在停止了这个变动以后,编译了一个具有 9851 个范例参数的方式。
由于参数的数目增加了很多,所以我利用的代码必定需要调剂。利用非 ASCII Unicode 标识符能够是完全高效的需要条件,但简单地指出这是可以做到的我就很满足了。
这些都不重要
很难设想有人会到达这个极限。代码天生偶然会到达说话或编译器的限制,但即使天生的代码似乎也不太能够利用成百上千的范例参数。
虽然如此,假如我是法则制定者,我会斟酌明白制止任何类或方式具有 255 个以上的范例参数。明白的限制似乎更好,即使它只影响百万分之一的法式。
原文链接:http://justinblank.com/experiments/howmanytypeparameterscanajavamethodhave.html
感激您的阅读

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 人才网||人才市场 网上求职|网上找工作 上潜力英才网 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表