IDE报告的不必要的拳击检查

Jux*_*hin 17 java ide

IDE报告的不必要的拳击检查

我最近查看了一些关于Swing#JTable的Oracle教程上发布的代码.IntelIJ返回了一些关于在保存Table数据的多维数组中装箱原始变量的警告消息.


这是找到的数组,取自docs.oracle.com:

Object[][] data = {
            {"Kathy", "Smith",
                    "Snowboarding", new Integer(5), new Boolean(false)},
            {"John", "Doe",
                    "Rowing", new Integer(3), new Boolean(true)},
            {"Sue", "Black",
                    "Knitting", new Integer(2), new Boolean(false)},
            {"Jane", "White",
                    "Speed reading", new Integer(20), new Boolean(true)},
            {"Joe", "Brown",
                    "Pool", new Integer(10), new Boolean(false)}
    };
Run Code Online (Sandbox Code Playgroud)

所有包装的变量都收​​到此消息:

"不必要的拳击'新整数(5)'报告"拳击",例如在对象中包裹原始值.在Java 5和更新版本下不需要拳击,并且可以安全地删除.此检查仅报告项目或模块是否配置为使用5.0或更高的语言水平."


我知道Java中装箱和拆箱的概念,我的问题是为什么它在新版本的Java中"无关紧要",因为我看到很多开发人员在讨论或最近使用它.

此外,由于不需要拳击,应该用'new Integer(5)'代替什么?

Jon*_*oni 25

由于Java 5及更新版本中的自动装箱,您不必调用Integer和Boolean构造函数来手动"封装"原始值.IDE似乎建议您将代码编写为:

Object[][] data = {
            {"Kathy", "Smith", "Snowboarding", 5, false},
            {"John", "Doe", "Rowing", 3, true},
            {"Sue", "Black", "Knitting", 2, false},
            {"Jane", "White", "Speed reading", 20, true},
            {"Joe", "Brown", "Pool", 10, false}
    };
Run Code Online (Sandbox Code Playgroud)

  • @Juxhin`Ball` auto(un)boxing使用`Boolean.FALSE`和`Boolean.TRUE`而不是创建新的`Boolean`实例,因此你的开销较少.类似地,`Integer`维护一个`Integer`对象的私有缓存,表示`-128`到`+ 127`,而auto(un)boxing将使用那些而不是创建新实例.或者让编译器自动(un)框为你,或者使用`.valueOf()`方法,它们首先检查缓存. (6认同)
  • 除了为您节省一点内存之外,自动装箱还提供了使用引用语义进行比较的某些保证.例如,由于autoboxed boolean将是Boolean.TRUE或Boolean.FALSE,而不是其他一些`Boolean`实例,您可以直接将它们与`==`运算符进行比较.否则你将不得不使用`equals`方法. (3认同)