- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,我们已经将一些东西投入生产,并且运行良好。但是,我在日志中看到一些非常令人不安的东西。即:
pr 0.1 - wait time for fetchAndRemoveEntries: 0
pr 1.0 - f'n'r entries: uid: hbyk68jfhbf5th
请注意,pr
对于这两行是不同的。运行代码搜索 wait time for fetchAndRemoveEntries
仅返回一个结果,f'n'r entries
也是如此。两者都是 println
。第一个是在我们的一个 API 类中找到的:
System.out.println("pr " + NotificationDataStorage.printReduction + " - wait time for fetchAndRemoveEntries: " + (System.currentTimeMillis() - startTime));
第二个位于我们的类 NotificationDataStorage 中,其中定义了 printReduction。该类的缩写版本:
public class NotificationDataStorage {
public static final double printReduction = 1;
...
public static void addEntries(ArrayList<HashMap> data) {
... // No, I have did not declare 'printReduction' as a local variable.)
System.out.println("pr " + printReduction + " - adding " + data.size() + " entries");
...
}
...
}
即使忽略“addEntries”代码,NotificationDataStorage.printReduction 返回 0.1 而实际上它应该为 1 的事实也非常令人担忧。
实际上,我们整个星期都被这样的问题所困扰,尽管直到现在它们总是在我们推送到服务器时消失。我们假设它们是本地怪癖,也许是 NetBeans 的缺陷。我在调试器中单步调试代码,查看传递给方法 A 的常量,当我进入 A 的范围时,看到它更改为以前构建的值。旧值导致代码崩溃。我将它设置为记录一些事情,问题神秘地消失了。我们的代码莫名其妙地不起作用,但在 check out 不同的分支并返回到不起作用的分支后,它突然又开始工作了。清洁和 build 有时会修复它。有时不是。
部分奇怪的是,据我所知,这是我们遇到这些问题的第一周。就好像一周前我们写了一些代码,它的位现在召唤了一个恶魔来扰乱我们的常量。或者,更准确地说,就好像当我们更新常量时,更改仅反射(reflect)在使用它们的某些地方。
当前出现的特定问题没有问题,但非常担心其他常量可能会遇到类似问题。
有没有人对此有任何见解、经验或解释?
最佳答案
这几乎可以肯定是因为并非所有代码都被重新编译。
您的字段是 public static final double
,它将在编译时获取内联值。如果值发生变化,这是一个巨大的问题,因为没有重新编译的旧类将不会更新它们的值!如果引用该字段的代码在不同的 jar 中,它可能也不会被重新编译。
The Java Security Coding Guidelines DCL59-J涵盖了这个问题
The final keyword can be used to specify constant values (that is, values that cannot change during program execution). However, constants that can change over the lifetime of a program should not be declared public final. The Java Language Specification (JLS) [JLS 2013] allows implementations to insert the value of any public final field inline in any compilation unit that reads the field. Consequently, if the declaring class is edited so that the new version gives a different value for the field, compilation units that read the public final field could still see the old value until they are recompiled. This problem may occur, for example, when a third-party library is updated to the latest version but the referencing code is not recompiled.
解决方案是将字段设为private
并改用公共(public)静态getter 方法。
private static final double PRINT_REDUCTION = 1; //will change often
public static double getPrintReduction(){
return PRINT_REDUCTION;
}
请注意,我还大写了字段,这是常量的 Java 编码约定。
Java Coding Guidelines Recommendations Book 中涵盖了该主题和更多问题
关于Java常量在不同的地方是不同的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32280675/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
操作无法完成。 Places API 库中发生内部错误。如果您认为此错误代表错误,请使用我们社区和支持页面 (https://developers.google.com/places/support)
我正在尝试在我的项目中使用 google places,我将其设置在 fragment 中而不是 Activity 中,我的自动完成 fragment 在 fragment 中。但是,当我尝试搜索它时
我的目的是使用R来查询google api。 我有一个地址和名称列表(属于商店、餐馆等),我需要为每个地址和名称存储: “纬度”、“经度”、“业务类型” 我的想法是使用 google place ap
我正在寻找设置一个自动完成的谷歌地方小部件。 我有一个带有“searchFieldText”id 的输入类型文本。 这是我的 JS 代码: var inputsec = document.getEle
是否可以使用图形 API(或地址/ zip )按纬度/经度和半径获取地点?我在文档中的任何地方都看不到它 最佳答案 搜索 URL 的以下格式将返回某个位置附近的地点列表: https://graph.
我正在探索 Google API,主要是 Places API。由于对 Google Places API 的请求数限制为 100,000,因此我正在寻找方法来最大限度地减少发送到 API 的请求数。
伙计们,我在我的应用程序中有一个功能,可以使用 GetFiles 在特定目录中搜索特定文件。方法 System.IO.Directory.GetFiles(string path, string
我已经在 Laravel 5.3 上使用 where 查询成功创建了许多函数,但是这次发生了一些奇怪的事情。 public function show($id){ $artikel = Art
我正在为我的 iPhone 应用程序使用 Facebook 图形 API 来获取附近地点的列表,我使用带有一些参数的“搜索”请求。我得到的响应是一个包含以下信息的地点列表:“纬度”、“经度”、“名称”
我有一个 Android 应用程序,我在其中使用 Google map 显示附近的地方,如加油站、药店等。我正在使用 map 和地点 API。 https://maps.googleapis.com/
我是一名优秀的程序员,十分优秀!