问题描述
我有一个类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){}
}
}
当然,它尚未实现,但是我想知道什么是正确的更改版本,例如播放器池。 我可以想象以下情形:
Player具有与Pool类完全相同的方法,类似于
public class Player { // something above void setAvailablePool(Stats stat, int value){ statistics.pool.setAvailable(stat, value); } }
这个解决方案似乎还可以,但是在Player类中,我将有很多1行方法,它们只能将订单重定向到组合字段。
- 我可以将pool和edge转移到Player类,并使它们成为public final,但是我读到可变对象应该相当私有。
那两个是我的第一个想法,但我想问一问,当我们使用组合时如何在课堂上创建接口。
1楼
单行方法不是问题,但是使解决方案#1令人不满意的是违反 (statistics.pool.setXXXX)。 最好使用statistics.setAvailableInPool()方法(或使用您的想法#2)。 对于具体的实现,我无法提供更多帮助,因为目前尚不清楚您的Pool和Edge类应该做什么(或者为什么它们如此相似但没有实现公共接口)。
在回答有关创建用于合成的接口的一般问题时,请看一下 。 基本上,您应该从依赖项中考虑所需的行为,清楚地命名这些行为,并依赖于接口而不是具体的类。 这使得代码更易于理解,并且更容易在一个地方进行更改,而不必在任何地方进行更改。