由于某种原因,我经常发现自己做这样的事情:
foreach($source as $key => $value) {
if (!isset($arr[$key])) {
$arr[$key] = 0; // or any other value
}
$arr[$key] += something($value);
}
Run Code Online (Sandbox Code Playgroud)
当我拥有众所周知的数据源时,有时我会做:
foreach($source as $key => $value) {
@$arr[$key] += something($value);
}
Run Code Online (Sandbox Code Playgroud)
为了避免日志垃圾邮件(我不想从日志中删除警告或通知)
还有其他更紧凑,更智能或更美的方法吗?
希望一个简单的问题来回答。我找不到任何绝对明确的答案。任何人都可以帮助提供可靠的消息来源。
我的普遍看法是,如果不使用适当的同步块,延迟加载在多线程应用程序中是危险的。我想知道这是否适用于 Spring。
谢谢。
对于延迟评估的属性,以下两种方法(具有支持字段的属性和具有默认值的属性)之间是否有任何差异,或者它们是否等效?
// (1)
public static class Foo
{
private static readonly Lazy<Foo> instance = new Lazy<Foo>();
public static Foo Instance { get; } = instance.Value;
}
// (2)
public static class Foo
{
public static Foo Instance { get; } = new Lazy<Foo>().Value;
}
Run Code Online (Sandbox Code Playgroud)
我想要实现的是,Foo仅在访问 时创建 的实例Foo.Instance,而不是之前创建 - 更重要的是,当Foo.Instance从未访问过时,不应创建任何实例。
我有一个枚举,我想我可以缓存values().
enum MyEnum {
SOME;
private static volatile Set<MyEnum> values_;
public static Set<MyEnum> values_() {
Set<MyEnum> result = values_;
if (result == null) {
values_ = result = Collections.unmodifiableSet(EnumSet.allOf(MyEnum.class));
}
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了允许重复初始化的延迟初始化。
奏鸣曲也有volatile Set<MyEnum>部分抱怨。
SonaLint:使用线程安全类型;添加“易失性”不足以使该字段成为线程安全的。
https://rules.sonarsource.com/java/RSPEC-3077
我的代码有问题吗?