return 破坏封装的 lambda 是糟糕的设计标志
Is bad design sign to return a lambda that breaks encapsulation
我有一个 Game
class 需要一些由 Generator
s classes 生产的资源。每个游戏都有自己的生成器,因为生成器是需要实例化的重对象,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
.
的每个 class 中几乎相同
我想做的是为 game
提供一个 Supplier<MapBoardGenerator>
,这样控件将在别处制作,getInstance
方法将简单地是:
public static MapBoardGenerator getInstance(Game game) {
return game.getInstance(MapBoardGenerator.class, MapBoardGenerator::new);
}
如果我传递调用私有构造函数的供应商,是否有问题?这是一个大学项目,设计在这里很重要。
将私有构造函数作为 Supplier
的实例传递不会破坏封装,因为构造函数作为 Supplier
的实例传递。实例的接收者(在本例中为 Game
)不知道 Supplier
是如何实现的,只知道它实现了 Supplier
接口。这就是 接口编程 的全部内容:即使调用者提供了具体的实现,接收者也只知道实现实现的接口。如果 Game
知道它正在获取的具体实现,就会违反封装。
请注意,将 Supplier
传递给 Game
在您的应用程序的更大上下文中可能有意义也可能没有意义,但至少它不会违反 MapBoardGenerator
的封装.
我的 2 美分:也许您应该看看洋葱架构。在洋葱架构中,您的业务(游戏?)由基础设施组件(发电机?)引用。这可能意味着将 lambda 表达式从 Generator 实例注入(或委托)到 Game 实例中,以保持层和职责的良好分离。
我不明白你为什么要通过反射实例化一个新实例(对我来说这是一个 hack,但是,因为我来自 C#,所以这句话可能不合适)...
我有一个 Game
class 需要一些由 Generator
s classes 生产的资源。每个游戏都有自己的生成器,因为生成器是需要实例化的重对象,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
.
我想做的是为 game
提供一个 Supplier<MapBoardGenerator>
,这样控件将在别处制作,getInstance
方法将简单地是:
public static MapBoardGenerator getInstance(Game game) {
return game.getInstance(MapBoardGenerator.class, MapBoardGenerator::new);
}
如果我传递调用私有构造函数的供应商,是否有问题?这是一个大学项目,设计在这里很重要。
将私有构造函数作为 Supplier
的实例传递不会破坏封装,因为构造函数作为 Supplier
的实例传递。实例的接收者(在本例中为 Game
)不知道 Supplier
是如何实现的,只知道它实现了 Supplier
接口。这就是 接口编程 的全部内容:即使调用者提供了具体的实现,接收者也只知道实现实现的接口。如果 Game
知道它正在获取的具体实现,就会违反封装。
请注意,将 Supplier
传递给 Game
在您的应用程序的更大上下文中可能有意义也可能没有意义,但至少它不会违反 MapBoardGenerator
的封装.
我的 2 美分:也许您应该看看洋葱架构。在洋葱架构中,您的业务(游戏?)由基础设施组件(发电机?)引用。这可能意味着将 lambda 表达式从 Generator 实例注入(或委托)到 Game 实例中,以保持层和职责的良好分离。
我不明白你为什么要通过反射实例化一个新实例(对我来说这是一个 hack,但是,因为我来自 C#,所以这句话可能不合适)...