如何创建一个Java类的两个接口,一个只读,一个读写?

shi*_*igo 6 java interface

我正在用Java编写一个游戏引擎,用于双人纸牌游戏,我的学生将为其编写AI玩家.

AI玩家将把扑克牌轮流放到他们面前"桌子"的"场地"上.他们可以用自己场上的牌攻击另一个玩家场上的牌.卡片可以面朝上或面朝下.

GameEngine类通过调用GamePlayer.TakeTurn(GameEngine eng)方法允许AI玩家轮到他/她.玩家可以向游戏引擎询问防守玩家的场地,以便玩家可以根据那里的牌数以及哪些牌面朝上来做出决定.假设这个方法是GameEngine.GetDefendingField()

现在,我想确保攻击玩家无法修改防御玩家的场地或防守玩家场地中的牌,并且攻击玩家只能识别防守玩家场中的面朝上牌.

我有Card,Field(一个ArrayList of Cards),GamePlayer和GameEngine的课程.有没有办法为Field创建一个接口,以便GameEngine可以返回防守玩家的场地而攻击玩家无法改变它?并且没有攻击玩家能够将防守球员的场地改造成可以改变的东西.

我可以让GameEngine.GetDefendingField()返回一个无法重新转换为字段的字段的只读接口吗?

TIA,

SH-

rsp*_*rsp 11

如果要在不复制的情况下实现此目的,并且无法将只读接口引用强制转换为相应的读写接口,则可以尝试使用包装器方法.

对于这样的界面:

interface Info {
    String getInfoA();
    void setInfoA(String infoA);
    String getInfoB();
    void setInfoB(String infoB);
}
Run Code Online (Sandbox Code Playgroud)

您可以创建一个只读包装器,它忽略setter或throws异常,例如:

class ReadonlyInfo implements Info {
    final Info instance;
    ReadonlyInfo(Info info) { 
         if (null == info) { throw new InvalidArgumentException(); } 
         instance = info; 
    }
    String getInfoA() { return instance.getInfoA(); }
    void setInfoA(String infoA) { /** silent ignore */ }
    String getInfoB() { return instance.getInfoB(); }
    void setInfoB(String infoA) { throw new IllegalStateException(); }
}
Run Code Online (Sandbox Code Playgroud)

通过使用包装器方法,您可以在客户端使用多态,安全地反对转换引用以获得更多访问权限,并在静默忽略调用setter或抛出非法访问异常之间进行选择.

注意:当然,对于使用反射来检索包装对象的代码,您将无法安全.

  • +1:我唯一不同的做法是抛出UnsupportedOperationException(就像不可变的Collection类那样)而不是IllegalStateException. (2认同)