小编AMT*_*AMT的帖子

返回ImmutableMap或Map更好吗?

假设我正在编写一个应该返回Map的方法.例如:

public Map<String, Integer> foo() {
  return new HashMap<String, Integer>();
}
Run Code Online (Sandbox Code Playgroud)

在考虑了一段时间之后,我决定在创建Map之后没有理由修改它.因此,我想返回一个ImmutableMap.

public Map<String, Integer> foo() {
  return ImmutableMap.of();
}
Run Code Online (Sandbox Code Playgroud)

我应该将返回类型保留为通用Map,还是应该指定我返回一个ImmutableMap?

从一个方面来说,这就是为什么创建接口的原因; 隐藏实现细节.
另一方面,如果我将这样离开,其他开发人员可能会错过这个对象是不可变的这一事实.因此,我不会实现不可变对象的主要目标; 通过最小化可以更改的对象的数量来使代码更清晰.甚至最糟糕的是,过了一段时间,有人可能会尝试更改此对象,这将导致运行时错误(编译器不会对此发出警告).

java design-patterns immutable-collections

88
推荐指数
7
解决办法
1万
查看次数

同时迭代两个集合

在Go中,同时迭代2个集合的最佳方法是什么?

在我的程序中,我有一个函数创建两个数组,另一个函数需要同时迭代它们(在每次迭代中访问两个数组中的第i个元素).

如果我有一个输入,我会在第一个函数(而不是数组)中创建一个通道,并使用范围循环从各种goroutine迭代它.

在这种情况下,是否有一个比创建索引通道并使用它来访问数组更简单的解决方案?

func main() {
    // Prepare two arrays.
    arrA := [12]int{1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144}
    arrB := arrA

    // Create a channel with the indexes.
    c := make(chan int, len(arrA))
    for i := range arrA {
        c <- i
    }
    close(c)

    poolSize := 3
    var wg sync.WaitGroup
    wg.Add(poolSize)

    for i := 1; i <= poolSize; i++ {
        go func() {
            defer wg.Done()
            for j := range c {
                fmt.Printf("%v == …
Run Code Online (Sandbox Code Playgroud)

arrays channel go

2
推荐指数
1
解决办法
87
查看次数

带有指针的C++显式构造函数

我最近偶然发现了一个接收单个指针参数的显式构造函数.我想知道在这种情况下是否需要显式关键字?因为没有指针的构造函数所以不能有任何隐式转换.

class Foo {
 public:
  explicit Foo(int* int_ptr);
}
Run Code Online (Sandbox Code Playgroud)

c++ instantiation explicit-conversion

1
推荐指数
1
解决办法
252
查看次数