Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回破坏封装的lambda是否是错误的设计标志_Java_Design Patterns_Lambda_Encapsulation - Fatal编程技术网

Java 返回破坏封装的lambda是否是错误的设计标志

Java 返回破坏封装的lambda是否是错误的设计标志,java,design-patterns,lambda,encapsulation,Java,Design Patterns,Lambda,Encapsulation,我有一个Game类,它需要Generators类生成的一些资源。每个游戏都有自己的生成器,因为生成器是很重的对象,需要实例化,game保留一个包含实例的对象池。在每个生成器中,我都有如下方法: private MapBoardGenerator(Game game) { super(game); } public static MapBoardGenerator getInstance(Game game) { MapBoardGenerator instance = game

我有一个
Game
类,它需要
Generator
s类生成的一些资源。每个游戏都有自己的生成器,因为生成器是很重的对象,需要实例化,
game
保留一个包含实例的对象池。在每个生成器中,我都有如下方法:

private MapBoardGenerator(Game game) {
    super(game);
}

public static MapBoardGenerator getInstance(Game game) {
    MapBoardGenerator instance = game.getGenerator(MapBoardGenerator.class);
    if (instance == null) {
        instance = new MapBoardGenerator(game);
        game.addGenerator(MapBoardGenerator.class, instance);
    }
    return instance;
}
这个静态方法在扩展
Generator
的每个类中几乎都是相同的

我想做的是为
游戏
提供一个
供应商
,以便在其他地方进行控制,
getInstance
方法就是:

public static MapBoardGenerator getInstance(Game game) {
    return game.getInstance(MapBoardGenerator.class, MapBoardGenerator::new);
}

如果我通过一个调用私有构造函数的供应商,是否有问题?这是一个大学项目,设计在这里非常重要。

将私有构造函数作为
Supplier
的实例传递不会破坏封装,因为构造函数是作为
Supplier
的实例传递的。实例的接收者(在本例中为
游戏
)不知道
供应商
是如何实现的,只知道它实现了
供应商
接口。这就是接口编程的全部内容:即使调用方提供了一个具体的实现,接收方也只知道实现所实现的接口。如果
游戏
知道它将得到的具体实现,则会违反封装


请注意,将
供应商
传递给
游戏
在应用程序的更大上下文中可能有意义,也可能没有意义,但至少它不会违反
MapBoardGenerator
我的2美分:也许你应该看看onion架构。在洋葱架构中,您的业务(游戏?)由基础设施组件(生成器?)引用。这可能意味着lambda表达式从生成器实例注入(或委托)到游戏实例中,以保持层和职责的良好分离


我不明白为什么你应该通过反射来实例化一个新实例(对我来说,这是一种攻击,但是,因为我来自C#,也许这句话不合适).

那么循环引用呢?我是说反射?