小编ryb*_*bit的帖子

Java isInstance vs instanceOf运算符

整个泛型的东西有点像扔我一个循环,更多的RTT.

Specificis?啊,这里的要点是:

enum QueryHelper {
  query1,
  query2;
  static <T> QueryHelper getQueryHelper (Class<T> expectedReturn) {
    if (expectedReturn.isInstance (SomeRelatedClass.class))
      return query1;
    else
      return query2;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我会这样称呼它:

...
QueryHelper helper = QueryHelper.getQueryHelper(SomeRelatedClass.class);
...
Run Code Online (Sandbox Code Playgroud)

这样我就可以在实际帮助器中灵活地分配查询返回类型.它做了一些铸造和对象创建.我所看到的是,没有比赛,我应该以其他方式这样做吗?或者整个想法是不是很糟糕?

而真正的核心是我不理解class.isInstance和instanceOf运算符之间的区别?我应该使用后者吗?

java inheritance typing rtti

24
推荐指数
1
解决办法
5万
查看次数

带有测试包的 golang 导入周期

我正在尝试重构一些测试代码,并且在两个包中我需要做同样的事情(连接到数据库)。我正在进入一个导入周期。我明白为什么我不能这样做,但我想知道最好的解决办法是什么。

具体来说,我有三个包:testutilsclientengine

在引擎中,我定义了一个接口和实现(均导出)。

package engine
type interface QueryEngine {
  // ...
}
type struct MagicEngine {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

然后在testutils包中我将创建一个MagicEngine并尝试返回它。

package testutils
func CreateAndConnect() (*engine.MagicEngine, error) {
  // ....
}
Run Code Online (Sandbox Code Playgroud)

现在在测试代码中(使用TestMain)我需要做类似的事情

package engine
func TestMain(m *testing.M) {
  e, err := testutils.CreateAndConnect()
  // ....
  os.Exit(m.Run())
}
Run Code Online (Sandbox Code Playgroud)

这当然是一个循环。我想这样做,以便我可以在client包中也使用这个testutils.CreateAndConnect()方法。我不想重复两个包中的代码。我不希望它出现在engine包的主代码中,它对于测试来说非常具体。

engine我尝试将其添加为测试类 ( )上的导出方法engine/engine_test.go,并在client/client_test.go. 没有骰子。:/

我觉得我已经用其他语言做到了这一点,但可能很疯狂。构建此代码以实现可重用性的最佳方法是什么?

testing go

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

用于关闭连接的Java弱引用

当我的对象被描述时,我试图找出关闭服务连接的最佳方法.

我有这样的事情:

class something {
  public final LongConnection lc;
  public something ()  {
    lc = new LongConnection ();
    lc.initConnection ();
    new Thread (new Runnable () { 
      public void run () { 
        ReferenceQueue<LongConnection> rq = new ReferenceQueue<LongConnection> ();
        WeakReference<LongConnection> wr = new WeakReference<LongConnection> (lc, rq);

        // now it should start listening for the object to be added to the queue
        while (true) {
          Reference<? extends LongConnection> ref = rq.remove ();
          if (rq != null) { 
            rq.get ().shutdown ();
            break;
          }
        } …
Run Code Online (Sandbox Code Playgroud)

java weak-references

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

使用设置受保护值的Golang继承

我想更好地理解如何在Go中使用受保护的空间.我来自java,这意味着我可以通过受保护的继承访问值,因为这里只有组合我想确保我在正确的路径上.

问题:我想在子实现中设置一个值,但不在通用接口上公开一个setter.

当真正没有层次结构时,为"子类"提供setter的最佳方法是什么?

这意味着我想:

type Bottom interface {
    GetYouSome()

    // rote things
    SetSpeed(int)
    DeliveryMechanism() chan string
}
Run Code Online (Sandbox Code Playgroud)

请注意,没有SetDeliveryMechanism(chan string)方法.

我想我会从一个实现死记硬背的基础开始,这意味着实际的实现将提供'GetYouSome'方法.我也希望这些存在于不同的包中.将有几十个实现,我希望将命名空间用沙箱(即它们都可以使用const DefaultPort).

为了说明问题,我做了一个小项目.它的布局如下:

.
??? src
    ??? main.go
    ??? parent
        ??? child
        ?   ??? child.go
        ??? parent.go
Run Code Online (Sandbox Code Playgroud)

child.go我们在哪里实际创建了几种类型Bottom,但parent.go实际上我们定义了样板代码(setters/getters).问题是我不能在任何地方实例化频道!

理想情况下,实现看起来像这样:

//------------- parent.go -------------
package parent

type Bottom interface {
    GetYouSome()

    // rote things
    SetSpeed(int)
    DeliveryMechanism() chan string
}

// Intended to implement the boring things
type GenericBottom struct {
    speed        int
    deliveryChan chan string …
Run Code Online (Sandbox Code Playgroud)

inheritance go

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

golang json编码为空地图返回{}

我试图让我真的回到这样的事情: {"map": {}}不是,{"map":null}但编码/ json似乎检测到这是一个空地图,只返回后一个值.

type test struct {
    MyMap map[string]string `json:"map"`
}

func main() {
    testval := test{}
    asjson, err := json.Marshal(testval)
    fmt.Println(testval)
    fmt.Println(string(asjson))
}
Run Code Online (Sandbox Code Playgroud)

输出是这样的

{map[]}
{"map":null}
Run Code Online (Sandbox Code Playgroud)

我希望得到它的{"map":{}}建议?我试图手动初始化地图,并使用它的参考.似乎都没有产生我想要的输出.:/

json go

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

Ansible:使用带有vars的嵌套组

我有一种情况,我们有3层盒子,在每一层我们应用不同的变量设置(如缓存目录所在的位置),但有一堆默认值.我还需要在每个节点上覆盖,这通常通过主机本身的库存变量来完成.我不确定组织主机的最佳方法是什么,以便优先顺序对我有利.

以下是我尝试过的不同内容.在每种情况下,我在库存文件中都有这样的条目:

[bots-fancy]
fancy-1 

[bots-super-fancy]
super-1

[bots-magical]
magic-1
magic-2 provider=aws
Run Code Online (Sandbox Code Playgroud)

起初,我让每个人都有一长串变量定义.我也有不同的group_var/bots/[bots-magical | bots-super-fancy | bots-fancy].yaml文件.这很快变得难以为继.


尝试1:使用playbook变量在剧本中我有这样的事情:

---
hosts:
  - bots
vars_files:
  - "group_vars/bots/defaults.yml"
  - "group_vars/bots/{{ groups_names[0] }}.yml"
roles:
  - somethign
Run Code Online (Sandbox Code Playgroud)

这工作(虽然是脆弱的)但它不会让我覆盖每个主机.我不得不偶尔在节点上设置不同的东西,但不是整个组.


尝试2:group_vars每个人使用

我补充道

[bots:children]
bots-fancy
bots-super-fancy
bots-magical
Run Code Online (Sandbox Code Playgroud)

到hosts文件.vars_files从剧本中删除任何内容并group_vars为每个组创建.我添加了默认/共享设置group_vars/bots.yaml.当我运行playbook时,它只会加载bots它看起来的group_vars.理想情况下,我希望它加载bots,然后用它覆盖它bots-fancy.然后最后来自hosts文件的值.

我不确定构建这些组的最佳方法,所以任何输入都会非常有用!

ansible ansible-inventory

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