小编Aub*_*ron的帖子

有空方法可以吗?

是否可以使用空方法并在子类中重写它?这就是我的代码中的样子.

public class Rook() {

    public void voidCastleRight() { }

}

public class ShortRook() extends Rook {

    @Override
    public void voidCastleRight() {
        getPlayer().setkSC(false); //void King Side Castling (Short Castle)
    }

}

public class LongRook() extends Rook {

    @Override
    public void voidCastleRight() {
        getPlayer().setqSC(false); //void Queen Side Castling (Long Castle)
    }
}
Run Code Online (Sandbox Code Playgroud)

上下文是国际象棋引擎.它是用Java编写的,它必须搜索下一个"最佳"移动,以便给出一个状态.因此,一切都尽可能高效地实施是很重要的,因为许多方法将被称为数百万次.因此,我想要这个Rooks的等级,而不是一个Rook类,我必须检查Rook在哪一侧并检查Rook是否处于其初始位置等等.

首次创建Board时,会有ShortRook和LongRook.随着游戏的进行,有可能因为典当促销而将更多的白嘴鸦引入游戏中.这些将是鲁克的实例.

voidCastleRight()每当移动Rook时都会调用该方法.由于Pawn升级而存在的车辆不应该在移动时使城堡无效(空方法).自游戏开始以来存在的鲁克斯应该在移动时使城堡权利无效(子类中的方法).

我还编写了一个解析器,它接受FENStrings并将它们转换为Board,反之亦然.当鲁克斯不在他们的初始位置时,没有办法分辨出Short-LongRook和LongRook.这不是问题,因为无论如何城堡权利已经废除,它们可以被解析为鲁克的实例.因此,如果我将一个Short或LongRook对象输入Rook,只要它已经使相关的城堡无效(即它已经移动),那么它会没有问题吗?通过这种方式,当城堡已经无效时,它不会毫无疑问地无效.我不关心这些解析器方法的复杂性,因为它们不会在搜索中使用.

虽然有些人可能会认为这些想法是微观优化"这是所有邪恶的根源",但是当这种方法被称为几百万次时,这些优化可能会得到回报.我也更关注OOP范式.

PS:我知道Java不是用于此应用程序的最佳语言,它无关紧要.我知道对象创建(在Java中)很昂贵.我将确保在搜索过程中没有创建任何对象.

java oop chess subclass hierarchy

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

如何防止 Docker 编辑我的主机文件?

由于最近在我的 Windows 机器上更新了 Docker,Docker Desktop 开始向我的etc\hosts文件中添加条目。我不确定是哪个版本引入了它,但我目前在 Docker 桌面社区 2.1.0.1 (31799) 上。

我希望我的etc\hosts文件只包含以下条目:

127.0.0.1 localhost host.docker.internal

但时不时,Docker Desktop 会添加额外的条目,导致:

127.0.0.1       localhost host.docker.internal
# Added by Docker Desktop
10.4.123.44 host.docker.internal
10.4.123.44 gateway.docker.internal
# To allow the same kube context to work on the host and the container:
127.0.0.1 kubernetes.docker.internal
# End of section
Run Code Online (Sandbox Code Playgroud)

如果我删除它们,它们最终会重新出现。如何防止 Docker 添加这些条目?

docker

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

如果在Serializable接口中使用Java,是否会自动生成Serializable类?

假设我有一个Serializable接口,如下所示

public interface SomeInterface extends Serializable {

     public SomeClass getSomething(String someParameter);

}
Run Code Online (Sandbox Code Playgroud)

SomeClass自动进行Serializable吗?令我们惊讶的是,即使SomeClass没有实现Serializable ,我们的RMI应用程序也能正常运行.

为什么是这样?

java serialization

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

Java 8 lambda表达式求值

我有一个类似于以下方法:

public double[] foo(double[] doubleArray) { 
    DoubleStream stream = Arrays.stream(doubleArray);

    return stream.map(s -> s / stream.sum()).toArray();
}
Run Code Online (Sandbox Code Playgroud)

这种方法的复杂性是什么?多少次会DoubleStreamsum方法被执行?一次或O(n)多次,有n = doubleArray.length

java java-8 java-stream

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

为什么我不能覆盖我的界面的方法?

假设我有一个如下界面.

interface CardHolder : IEnumerable<Card>
{
    /// <summary> ...
    void PutCard(Card card);

    /// <summary> ...
    void PutCards(Card[] card);

    /// Some more methods...
}
Run Code Online (Sandbox Code Playgroud)

我实现如下.

public class ArrayCardHolder : CardHolder
{
    private Card[] _cards;
    private int _size = 0;

    public ArrayCardHolder(int capacity)
    {
        _cards = new Card[capacity];
    }

    public void PutCard(Card card)
    {
        if (IsFull())
            throw new Exception("This CardHolder is full. Capacity: " + Capacity());

        _cards[_size++] = card;
    }

    public void PutCards(Card[] cards)
    {
        if (_size + cards.Length > _cards.Length)
            throw …
Run Code Online (Sandbox Code Playgroud)

c# overriding interface

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