我已经开始了一个相当大的所谓的Descriptors枚举,我想在我的模型中用作参考列表.但是现在我第一次遇到编译器/ VM限制因此我正在寻找最好的解决方案来处理这个问题.
这是我的错误:静态初始化程序的代码超过65535字节限制
很明显这是从哪里来的 - 我的Enum只有很多元素.但是我需要那些元素 - 没有办法减少那个元素.
最初,我计划使用单个枚举,因为我想确保Enum中的所有元素都是唯一的.它用于Hibernate持久化上下文,其中对Enum的引用在数据库中存储为String值.所以这必须是独一无二的!
我的Enum的内容可以分成几组属于一起的元素.但拆分Enum会消除我在编译期间获得的独特安全性.或者可以通过某种方式实现多个枚举?
我目前唯一的想法是定义一些名为Descriptor的接口,并编写几个实现它的Enum.这样我希望能够使用Hibernate Enum映射,就好像它是一个Enum一样.但我甚至不确定这是否有效.我放松了独特的安全.
任何想法如何处理这种情况?
以下代码NullPointerException在main中失败(map==null).只有在我定义2001或更多枚举常量时,才会出现问题,2000工作正常.
为什么不执行静态代码块?
我们是否达到编译器的任何静默限制(没有警告,没有错误)或JVM?
编译后的类文件超过172KB,
import java.util.HashMap;
public enum EnumTest {
E(1),E(2),...,E(2001);
private static HashMap<Integer, EnumTest> map = new HashMap<Integer, EnumTest>();
static {
for ( EnumTest f : EnumTest.values() ) {
map.put( (int) f.id, f );
}
}
short id;
private EnumTest(int id) {
this.id = (short) id;
};
public short getId() {
return id;
}
public static final EnumTest fromInt(int id) {
EnumTest e = map.get( id );
if ( e != null ) {
return …Run Code Online (Sandbox Code Playgroud) 我试图解决java中的非线性函数系统.特别是我有3个方程,有3个未知变量.虽然我已经设法解决了简单的方程式,但我的最终目标是解决一些相当大的方程式.例如,每个等式由以下形式的数百行(有时甚至数千行)组成:
public static double f2 (double x, double y, double z) {
double result = (0.49*Math.exp(-y - x)*Math.pow(x,2)*
(1 - Math.pow(z,94)*(0.00666 +
0.98*Math.exp(-y - x) + 0.98*Math.exp(-y - x)*
y*x + 0.245*Math.exp(-y - x)*Math.pow(y,2)*
Math.pow(x,2) + 0.02722*
Math.exp(-y - x)*Math.pow(y,3)*Math.pow(x,3) +
0.00170*Math.exp(-y - x)*
Math.pow(y,4)*Math.pow(x,4) + 0.00006*
Math.exp(-y - x)*Math.pow(y,5)*Math.pow(x,5) +
1.89043*Math.pow(10,-6)*Math.exp(-y - x)*
Math.pow(y,6)*Math.pow(x,6) + 3.85802*Math.pow(10,-8)*
Math.exp(-y - x)*Math.pow(y,7)*Math.pow(x,7) +
6.02816*Math.pow(10,-10)*Math.exp(-y - x)*
Math.pow(y,8)*Math.pow(x,8) + 7.44217*Math.pow(10,-12)*
Math.exp(-y - x)*Math.pow(y,9)*Math.pow(x,9) +
7.44217*Math.pow(10,-14)*Math.exp(-y - x)*
Math.pow(y,10)*Math.pow(x,10))))/(0.01333 +
0.98*Math.exp(-y - x)*y + …Run Code Online (Sandbox Code Playgroud) 我是在一个编程竞赛的最后一个周末(资格赛一轮的ICPC),我试图做的是有关(其中包括)分解整数范围内的问题,0 <= i <= 1,000,000为素数.
我的第一个想法是"哦不,因为整数是在NP,我们需要找到一种方法来避免花时间在它上面." 我们在Java工作.作为主要是一个C程序员,我的第一反应是用一个脚本来预先计算所有的素数高达1,000,000,其格式与Java数组,并试图将其插入到我的代码.我的理由是它节省了我们在定时部分运行类似于Eratosthenes筛子的时间,通过类似n的因子减少时间复杂度,并通过它轻而易举.
然后我被"代码太大"错误命中,我的几十万个int数组被编译器拒绝了.由于竞争规则,无法将其读入文件,或将其存储在除包含具有main方法的类的.java文件之外的任何位置.
我尝试将它分解成类似100,000 int块的东西,但是因为它仍然太大而无法工作(除了Java 7文档之外我们没有任何东西可以查阅,而且我无法找到任何关于"代码太大"的内容错误信息).我们最终放弃了,尝试了另一种方法,并让它运作起来,但它最终耗费了我们总比赛时间的四分之一,并且显着损害了我们的分数.
所以,我的问题是:有什么理智的方法来解决这个问题与查找表?是不是不可能在Java程序中获得一个巨大的预编译查找表?
我也很好奇这种语言限制背后的原因......它是一种安全的东西,不知何故?为什么编译器会限制方法的字节码大小?
我正在创建一个应用程序,它在数据库中查找(我目前正在构建).当我收到错误时,我已经完成了超过10/12 :代码太大而不能作为Gradle Build消息.
java文件几乎只是一个"数据库"(在另一个类中使用数据).
它具有以下形式:
static int[][] mDatabase10 = new int[][]{{1, 0, 0, 0, 11, 22},
{1, 53, 42, 0, 41, 0},
{7, 34, 11, 33, 32, 0}};
Run Code Online (Sandbox Code Playgroud)
每个阵列阵列中有80个阵列(其中12个):
static int[][][][] dbDatabase = {{mDatabase10, mDatabase10a, mDatabase10b, mDatabase10c,
mDatabase10d, mDatabase10e, mDatabase10f, mDatabase10g, mDatabase10h, mDatabase10i,
mDatabase10j, mDatabase10k, mDatabase10l, mDatabase10m, mDatabase10n, mDatabase10o,
mDatabase10p, mDatabase10q, mDatabase10r, mDatabase10s, mDatabase10t, mDatabase10u,
mDatabase10v, mDatabase10w, mDatabase10x, mDatabase10y, mDatabase10z, mDatabase11a,
mDatabase11b, mDatabase11c, mDatabase11d, mDatabase11e, mDatabase11f, mDatabase11g,
mDatabase11h, mDatabase11i, mDatabase11j, mDatabase11k, mDatabase11l, mDatabase11m,
mDatabase11n, mDatabase11o, mDatabase11p, mDatabase11q, …Run Code Online (Sandbox Code Playgroud) 有没有办法建立一个有很多字段的defrecord?似乎有大约 122 个字段的限制,因为这给出了“方法代码太大!” 错误:
(defrecord WideCsvFile
[a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19
a20 a21 a22 a23 a24 a25 a26 a27 a28 a29 a30 a31 a32 a33 a34 a35 a36 a37 a38 a39
a40 a41 a42 a43 a44 a45 a46 a47 a48 a49 a50 a51 a52 a53 a54 a55 a56 a57 a58 a59
a60 a61 a62 a63 a64 a65 a66 a67 a68 a69 a70 a71 a72 a73 …Run Code Online (Sandbox Code Playgroud) 我正在开发一个项目,我需要生成java代码.当我遇到主方法上65535字节限制的问题时,我正在做一些测试.我生成的文件看起来像这样:
public class foo{
public static void main(String[] args){
//
//7000 lines later
//
}
}
Run Code Online (Sandbox Code Playgroud)
我认为通过这种方式生成文件我很聪明:
public class foo{
public static void bar(){
//
//7000 lines later
//
}
public static void main(String[] args){
bar();
}
}
Run Code Online (Sandbox Code Playgroud)
但我发现65535字节限制适用于每种方法.
我想知道在多种方法中"缓冲"指令是否能解决我的问题.对java文件的大小有什么限制吗?