当前位置: 代码迷 >> java >> 掌握领域的构成方法
  详细解决方案

掌握领域的构成方法

热度:16   发布时间:2023-08-02 10:35:14.0

我有一个类Player,其中包含其他几个类的私有字段(我相信它称为composition)。

public class Player
{
    private String name;
    private Statistics statistics;
    private Experience experience;
    private Effort effort;
}

我只会发布其中一个名为“统计”的信息

public final class Statistics
{
    Pool pool;
    Edge edge;

    class Pool
    {
        private Map<Stats, LimitedInt> map = new HashMap<>();
        private int freePoints = 0;

        void setAvailable(Stats stat, int value){}
        int getAvailable(Stats stat){ return 0; }
        void setMax(Stats stat, int value){}
        int getMax(Stats stat, int value){ return 0; }
        void setFreePoints(int value){}
        int getFreePoints(){ return 0; }
        void spendFreePoints(Stats stat, int amount){}
    }

    class Edge
    {
        private Map<Stats, Integer> map = new HashMap<>();
        private int freePoints = 0;

        void setMax(Stats stat, int value){}
        int getMax(Stats stat, int value){ return 0; }
        void setFreePoints(int value){}
        int getFreePoints(){ return 0; }
        void spendFreePoints(Stats stat, int amount){}
    }
}

当然,它尚未实现,但是我想知道什么是正确的更改版本,例如播放器池。 我可以想象以下情形:

  1. Player具有与Pool类完全相同的方法,类似于

     public class Player { // something above void setAvailablePool(Stats stat, int value){ statistics.pool.setAvailable(stat, value); } } 

这个解决方案似乎还可以,但是在Player类中,我将有很多1行方法,它们只能将订单重定向到组合字段。

  1. 我可以将pool和edge转移到Player类,并使它们成为public final,但是我读到可变对象应该相当私有。

那两个是我的第一个想法,但我想问一问,当我们使用组合时如何在课堂上创建接口。

单行方法不是问题,但是使解决方案#1令人不满意的是违反 (statistics.pool.setXXXX)。 最好使用statistics.setAvailableInPool()方法(或使用您的想法#2)。 对于具体的实现,我无法提供更多帮助,因为目前尚不清楚您的Pool和Edge类应该做什么(或者为什么它们如此相似但没有实现公共接口)。

在回答有关创建用于合成的接口的一般问题时,请看一下 。 基本上,您应该从依赖项中考虑所需的行为,清楚地命名这些行为,并依赖于接口而不是具体的类。 这使得代码更易于理解,并且更容易在一个地方进行更改,而不必在任何地方进行更改。

  相关解决方案