我正在研究一些需要高度优化的Java代码,因为它将在我的主程序逻辑中的许多点调用的热函数中运行.此代码的一部分涉及将double变量乘以10凸起到任意非负int exponents.一个快速的方式(编辑:但不是最快的,见下面的更新2)获得相乘的值是switch在exponent:
double multiplyByPowerOfTen(final double d, final int exponent) {
switch (exponent) {
case 0:
return d;
case 1:
return d*10;
case 2:
return d*100;
// ... same pattern
case 9:
return d*1000000000;
case 10:
return d*10000000000L;
// ... same pattern with long literals
case 18:
return d*1000000000000000000L;
default:
throw new ParseException("Unhandled power of ten " + power, 0);
}
}
Run Code Online (Sandbox Code Playgroud)
上面注释的省略号表示case int常量继续递增1,因此case上面的代码片段中确实有19 秒.因为我不知道我是否真的需要10一切权力,并case声明 …
java compiler-construction performance assembly switch-statement
我正在尝试使用新的Amazon DynamoDB JSON API在名为"document"的JSON属性中添加/覆盖键值对.理想情况下,我想简单地构建我的写调用以发送KV对以添加到属性,并且如果给定主键尚不存在,则让Dynamo创建属性.但是,如果我只是简单地尝试这个UpdateItemSpec:
PrimaryKey primaryKey = new PrimaryKey("key_str", "mapKey");
ValueMap valuesMap = new ValueMap().withLong(":a", 1234L).withLong(":b", 1234L);
UpdateItemSpec updateSpec = new UpdateItemSpec().withPrimaryKey(primaryKey).withUpdateExpression("SET document.value1 = :a, document.value2 = :b");
updateSpec.withValueMap(valuesMap);
table.updateItem(updateSpec);
Run Code Online (Sandbox Code Playgroud)
我明白了com.amazonaws.AmazonServiceException: The document path provided in the update expression is invalid for update,这意味着DynamoDB找不到要应用更新的名为"document"的给定属性.
我设法使用以下一系列调用来近似此功能:
try {
// 1. Attempt UpdateItemSpec as if attribute already exists
} catch (AmazonServiceException e) {
// 2. Confirm the exception indicated the attribute was not present, otherwise rethrow it …Run Code Online (Sandbox Code Playgroud) 正如布洛赫在第3项规定("强制使用私有构造函数或枚举类型的单身财产")的有效的Java第二版,单元素枚举类型是实现一个单身的最佳途径.不幸的是,旧的私有构造函数模式仍然非常普遍和根深蒂固,以至于许多开发人员在创建枚举单例时并不理解我在做什么.
// Enum Singleton类声明之上的简单注释有所帮助,但它仍然留下了另一个程序员可以稍后出现并向枚举添加第二个常量,打破单例属性的可能性.对于私有构造函数方法所具有的所有问题,在我看来,它比枚举单例更自我记录.
我认为我需要的是一个注释,它既声明枚举类型是单例,并且在编译时确保只有一个常量被添加到枚举中.像这样的东西:
@EnumSingleton // Annotation complains if > 1 enum element on EnumSingleton
public enum EnumSingleton {
INSTANCE;
}
Run Code Online (Sandbox Code Playgroud)
有没有人在任何地方的公共图书馆中为标准Java运行这样的注释?或者是我在Java当前的注释系统中要求不可能的东西?
UPDATE
我正在使用的一种解决方法,至少在我决定真正打扰我自己的注释之前,就是@SuppressWarnings("UnusedDeclaration")直接放在INSTANCE场地前面.它使得代码看起来与简单的枚举类型截然不同.