小编Cso*_*agy的帖子

设计模式可自定义游戏中角色的可能状态

我决定使用Java构建类似于rpg的坚固游戏结构来练习设计模式。

基本上,我的游戏中存在不同类型的角色,这些角色均被视为“游戏对象”,具有一些共同的特征:

public abstract class Character extends GameObject {
  Status status;
  //fields, methods, etc.
}

public abstract class Monster extends Character{
  //fields, methods, etc
}

public class Hero extends Character {
  //fields, methods, etc
}
Run Code Online (Sandbox Code Playgroud)

这里的状态是一个枚举:

public enum Status {
  NORMAL,
  BURNT,
  POISONED,
  HEALED,
  FROZEN
}
Run Code Online (Sandbox Code Playgroud)

我想使我的代码灵活,易于修改,并且我想有效地使用必要的设计模式来遵循SOLID原则。

假设我要自定义字符,允许创建自定义的字符扩展名,从而仅允许某些状态更改。例如,我将创建一个名为

public class FireGolem extends Monster{...}
Run Code Online (Sandbox Code Playgroud)

,它不会因热而损坏(因此无法燃烧)。

我有2个想法可以做到这一点:

1)为角色类创建一个Set,在其中我将指定角色可以进行哪种状态更改

2)创建不同的接口(Burnable,Freezable等),并在必要时实施它们。

你怎么看?哪个更好?为什么?有没有更好更好的选择?

先感谢您。

java oop design-patterns

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

偶数的平均值给出了错误的值

我正在努力接近理解溪流,因此我正在做一些基本的练习.在这一个中,我想计算奇数的平均值.我写这个算法是为了这样做,但是它给出了不正确的结果(8.0).我试图调试它,但我找不到它实际上做了什么.

List<Integer> numbers = Arrays.asList(1, 3, -2, -4, -7, -3, -8, 12, 19, 6, 9, 10, 14);

OptionalDouble result = numbers.stream()
                               .filter(i -> i % 2 == 1)
                               .mapToDouble(i -> i).average();
if (result.isPresent()) {
   System.out.println(result);
} else {
   System.out.println("Error");
}
Run Code Online (Sandbox Code Playgroud)

我的代码现在在做什么?我应该如何解决它做它应该做的事情?

java lambda java-stream

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

打印出已过滤流的对象的某些字段

让我们假设有一个Fox类,它有名字,颜色和年龄.让我们假设我有一个狐狸列表,我想打印出那些颜色为绿色的狐狸名字.我想用流来做这件事.

领域:

  • name:私有String
  • color:private String
  • 年龄:私人整数

我编写了以下代码来进行过滤和Sysout:

foxes.stream().filter(fox -> fox.getColor().equals("green"))
     .forEach(fox -> System.out::println (fox.getName()));
Run Code Online (Sandbox Code Playgroud)

但是,我的代码中存在一些语法问题.

问题是什么?我该如何解决?

java lambda java-8 java-stream

4
推荐指数
2
解决办法
103
查看次数

如果单例不是线程安全的,这究竟意味着什么?

我已经阅读了他对 Singleton 的基本 Java 实现,因为我将在我的课堂上介绍设计模式:

public final class ClassSingleton {

    private static ClassSingleton INSTANCE;
    private String info = "Initial info class";

    private ClassSingleton() {        
    }

    public static ClassSingleton getInstance() {
        if(INSTANCE == null) {
            INSTANCE = new ClassSingleton();
        }

        return INSTANCE;
    }

    // getters and setters
}
Run Code Online (Sandbox Code Playgroud)

用过几次,对它很熟悉。然而,当我深入研究这个话题时,我发现这个版本根本不是线程安全的。

这究竟是什么意思?如果多个线程访问它并创建一个新实例,是否会创建更多不同的实例?或者“安全”在哪里不复存在?

感谢您提前回答。

java singleton

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

使用流在HashMap中收集事件

我有一个练习要解决.我有一个Fox类,它有名字和颜色字段.我的练习是按颜色找出狐狸的频率.

因此我创建了一个HashMap,其中String属性将是狐狸名称,而Integer将是它本身的出现:

    Map<String, Integer> freq = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)

完成后,我一直在尝试用流编写代码,但我正在努力做到这一点.我写了这样的东西:

    foxes.stream()
    .map(Fox::getColor)
    .forEach()
    //...(continued later on);
Run Code Online (Sandbox Code Playgroud)

,其中狐狸是一个清单.

我的问题基本上是语法.如果颜色没有出现,我想做一些事情

    freq.put(Fox::getName, 1)
Run Code Online (Sandbox Code Playgroud)

其他

    freq.replace(Fox::getName, freq.get(Fox::getName) + 1)
Run Code Online (Sandbox Code Playgroud)

我该怎么把它放在一起?

java hashmap java-8 java-stream method-reference

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