这种建设有意义吗?
Does this construction make sense?
遇到了一个使用此代码的项目:
public class IndexUpdater implements Runnable {
@Override
public void run() {
final AtomicInteger count = new AtomicInteger(0);
FindIterable<Document> iterable = mongoService.getDocuments(entryMeta, null, "guid");
iterable.forEach(new Block<Document>() {
@Override
public void apply(final Document document) {
count.incrementAndGet();
// A lot of code....
if (count.get() / 100 * 100 == count.get()) {
LOG.info(String.format("Processing: %s", count.get()));
}
}
});
}
}
这里我感兴趣的是三行代码:
if (count.get() / 100 * 100 == count.get()) {
LOG.info(String.format("Processing: %s", count.get()));
}
考虑到多线程和 AtomicInteger 变量的类型,这个条件有意义吗?或者这是一个毫无意义的支票?
有趣的是,IntellijIdea 并没有强调这个构造是没有意义的。
我不会称此代码为 "meaningless",而是 错误的 (或者,它可能具有意想不到的语义)。
如果以多线程方式调用它,您将不会总是在方法中的三个调用中获得相同的 count.get()
值(如果包含 count.incrementAndGet()
,则有四个) .
在 这种 情况下,这样做的后果看起来并不是灾难性的 - 您可能会错过一些日志记录语句,并且您可能会看到一些意想不到的消息,例如 Processing 101
,然后想知道为什么这个数字不是 100 的倍数。但也许如果你在其他地方采用相同的结构,会有更重要的影响。
将count.incrementAndGet()
的结果放入一个变量(*)中,以便以后使用。
但是,使用 count.get() % 100 == 0
也会更容易:
int value = count.incrementAndGet();
// A lot of code....
if (value % 100 == 0) {
LOG.info(String.format("Processing: %s", value));
}
这是正确的(或者,它可能是预期的)并且更容易阅读。
(*) 根据您实际希望通过此日志消息显示的内容,您可能希望将 count.incrementAndGet()
放在 "A lot of code" 之后。
遇到了一个使用此代码的项目:
public class IndexUpdater implements Runnable {
@Override
public void run() {
final AtomicInteger count = new AtomicInteger(0);
FindIterable<Document> iterable = mongoService.getDocuments(entryMeta, null, "guid");
iterable.forEach(new Block<Document>() {
@Override
public void apply(final Document document) {
count.incrementAndGet();
// A lot of code....
if (count.get() / 100 * 100 == count.get()) {
LOG.info(String.format("Processing: %s", count.get()));
}
}
});
}
}
这里我感兴趣的是三行代码:
if (count.get() / 100 * 100 == count.get()) {
LOG.info(String.format("Processing: %s", count.get()));
}
考虑到多线程和 AtomicInteger 变量的类型,这个条件有意义吗?或者这是一个毫无意义的支票? 有趣的是,IntellijIdea 并没有强调这个构造是没有意义的。
我不会称此代码为 "meaningless",而是 错误的 (或者,它可能具有意想不到的语义)。
如果以多线程方式调用它,您将不会总是在方法中的三个调用中获得相同的 count.get()
值(如果包含 count.incrementAndGet()
,则有四个) .
在 这种 情况下,这样做的后果看起来并不是灾难性的 - 您可能会错过一些日志记录语句,并且您可能会看到一些意想不到的消息,例如 Processing 101
,然后想知道为什么这个数字不是 100 的倍数。但也许如果你在其他地方采用相同的结构,会有更重要的影响。
将count.incrementAndGet()
的结果放入一个变量(*)中,以便以后使用。
但是,使用 count.get() % 100 == 0
也会更容易:
int value = count.incrementAndGet();
// A lot of code....
if (value % 100 == 0) {
LOG.info(String.format("Processing: %s", value));
}
这是正确的(或者,它可能是预期的)并且更容易阅读。
(*) 根据您实际希望通过此日志消息显示的内容,您可能希望将 count.incrementAndGet()
放在 "A lot of code" 之后。