gpt4 book ai didi

java - 访问组合中的字段方法

转载 作者:行者123 更新时间:2023-12-01 11:18:53 24 4
gpt4 key购买 nike

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

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 行方法,这些方法只会将订单重定向到组合字段。

  • 我可以将池和边缘转移到 Player 类并将它们公开为最终的,但我读到可变对象应该是相当私有(private)的。
  • 这两个是我的第一个想法,但我想问一下当我们使用组合时如何在类中创建接口(interface)。

    最佳答案

    单行方法不是问题,但是使您的解决方案 #1 不令人满意的是违反 Law of Demeter (statistics.pool.setXXXX)。最好有一个 stats.setAvailableInPool() 方法(或者使用你的想法#2)。我无法提供有关具体实现的更多帮助,因为不太清楚您的 Pool 和 Edge 类应该做什么(或者为什么它们彼此如此相似但没有实现通用接口(interface))。

    为了回答有关创建组合界面的一般问题,请查看 SOLID principles 。基本上,您应该考虑从依赖项中需要哪些行为,清楚地命名这些行为,并依赖于接口(interface)而不是具体的类。这使得代码更容易理解,并且更容易在一处进行更改,而不必在各处进行更改。

    关于java - 访问组合中的字段方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31490270/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com