gpt4 book ai didi

java - 为什么 Java 对常量的依赖不会导致重新编译?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:23:10 24 4
gpt4 key购买 nike

我有几个简单的类:

// src/Consts.java
public class Consts
{
public static final int A = 100;
public static final int B = 101;
}

和:

// src/Print.java
public class Print
{
public static void main(String[] args)
{
System.out.println("A: " + Consts.A + " B: " + Consts.B);
}
}

我有一个简单的 ant 构建文件:

<project name="Test" default="compile" basedir=".">
<!-- set global properties for this build -->
<property name="src" location="src"/>
<property name="build" location="build"/>

<target name="compile">
<mkdir dir="${build}"/>
<!-- Compile the java code from ${src} into ${build} -->
<javac srcdir="${src}" destdir="${build}" debug="on" />
</target>

<target name="clean">
<delete dir="${build}"/>
</target>
</project>

我运行 ant,然后运行 ​​java -cp build Print,我得到了预期的输出,A: 100, B: 101 .美好的。然后我编辑 Consts.java 以设置 A = 200 和 B = 201 并重新运行 ant。它说“编译 1 个源文件”,它是 Consts.java(通过查看类文件的时间戳确认)。然后我重新运行 java -cp build Print 并打印出 A: 100, B: 101。至少可以说,这是出乎意料的。

谷歌搜索表明来自 Consts 的值在编译时被替换为 Print 源代码。这很好,但我的问题是:为什么当 Consts 更改时 ant+javac 不重新编译 Print?两者之间存在明显的编译时依赖性。

(我只是对这个问题有点,在我看来这肯定是其中一个工具中的错误。或者我错过了什么?)

最佳答案

在看到 Andy Turner 的链接后进一步查看了一下,我认为 ant 比我想象的要笨得多。来自javac task :

Note: Apache Ant uses only the names of the source and class files to find the classes that need a rebuild. It will not scan the source and therefore will have no knowledge about nested classes, classes that are named different from the source file, and so on. See the task for dependency checking based on other than just existence/modification times.

提到的depend task甚至明确地说:

The most obvious example of these limitations is that the task can't tell which classes to recompile when a constant primitive data type exported by other classes is changed. For example, a change in the definition of something like

public final class Constants { public final static boolean DEBUG=false; }

will not be picked up by other classes.

这似乎准确地描述了我的情况。我认为这一切给我的教训是:(a) 不要使用 ant,(b) 如果使用,请在构建之前始终清理。

关于java - 为什么 Java 对常量的依赖不会导致重新编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40377437/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com