在构图中访问字段的方法

时间:2015-07-18 10:35:23

标签: java interface composition

我有一个类Player,其中包含很少的其他类的私有字段(我相信它被称为组合)。

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

我只会发布其中一个名为Statistics

的内容
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){}
    }
}

当然还没有实现,但我想知道什么是更改的正确版本,例如Player's Pool。我可以想象以下场景:

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

    public class Player
    {
        // something above
        void setAvailablePool(Stats stat, int value){ statistics.pool.setAvailable(stat, value); }
    }
    
  2. 这个解决方案似乎还可以,但是在Player类中,我会有很多单行方法,只是将订单重定向到组合字段。

    1. 我可以将pool和edge转移到Player类并使它们公开最终,但我读到可变对象应该是私有的。
    2. 这些是我的第一个想法,但我想在使用合成时一般询问如何在课堂上创建界面。

1 个答案:

答案 0 :(得分:1)

单行方法不是问题,但是使您的解决方案#1不满意的原因是违反了Law of Demeter(statistics.pool.setXXXX)。拥有statistics.setAvailableInPool()方法(或使用你的想法#2)可能更好。我可以&#39; t为特定的实现提供了更多的帮助,因为你不清楚你的Pool和Edge类应该做什么(或者为什么它们彼此如此相似但是没有实现通用接口)。 / p>

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