13947

与Java8蛋糕图案可能吗?(Cake pattern with Java8 possible?)

我只是想知道:与Java 8,并有可能加入的接口实现(有点像斯卡拉性状),才有可能实现蛋糕的图案 ,就像我们可以在Scala中呢?

如果是,有人可以提供一个代码片段?

Answer 1:

与其他答案启发我想出了以下(粗糙)类层次结构类似于在斯卡拉蛋糕的模式:

interface UserRepository { String authenticate(String username, String password); } interface UserRepositoryComponent { UserRepository getUserRepository(); } interface UserServiceComponent extends UserRepositoryComponent { default UserService getUserService() { return new UserService(getUserRepository()); } } class UserService { private final UserRepository repository; UserService(UserRepository repository) { this.repository = repository; } String authenticate(String username, String password) { return repository.authenticate(username, password); } } interface LocalUserRepositoryComponent extends UserRepositoryComponent { default UserRepository getUserRepository() { return new UserRepository() { public String authenticate(String username, String password) { return "LocalAuthed"; } }; } } interface MongoUserRepositoryComponent extends UserRepositoryComponent { default UserRepository getUserRepository() { return new UserRepository() { public String authenticate(String username, String password) { return "MongoAuthed"; } }; } } class LocalApp implements UserServiceComponent, LocalUserRepositoryComponent {} class MongoApp implements UserServiceComponent, MongoUserRepositoryComponent {}

上述关于Java 8编译为1月9日2013年。


因此,可以的Java 8做花纹cake-? 是。

它是那样简单的斯卡拉,或一样有效的Java(即依赖注入)其他模式? 或许不是,上面的草图需要一大堆的文件,而不是如Scala的那样简单。

综上所述:

  • 自的类型(作为所需的饼图案)可以通过延伸的基本接口我们期望进行仿真。
  • 接口不能有内部类(如@Owen说明),所以我们可以将使用匿名类。
  • valvar可以通过使用静态散列映射(和延迟初始化)来模拟,或由类的客户端简单地存储在其一侧的值(如UserService一样)。
  • 我们可以发现,通过使用我们的类型this.getClass()的默认界面方法。
  • 如@Owen笔记,路径依赖的类型是不可能使用的接口,所以全饼图案本质上是不可能的。 上面显示,但是,人们可以用它依赖注入。


Answer 2:

我做了一个小的证明,在概念上这家最近。 你可以看到这里的博客文章: http://thoredge.blogspot.no/2013/01/cake-pattern-in-jdk8-evolve-beyond.html这里的GitHub库: https://github.com/thoraage /饼-DB-jdk8

基本上你可以做到这一点,但你至少面临两个障碍,使得它比斯卡拉不太光滑。 首先斯卡拉性状可以有状态和Java的接口不能。 许多模块需要的状态。 这可以通过创建一个一般状态组件来保存这些信息是固定的,但是这将需要一个类。 至少部分。 第二个Question是,在一个界面中的嵌套类更像是在类的静态嵌套类。 所以你不能直接从模块类访问接口的方法。 默认的接口方法可以访问此范围,并可以添加到这个模块类的构造函数。



Answer 3:

一些实验表明NO:

  • 嵌套类是自动静态的。 这本质上是uncakelike:

    interface Car { class Engine { } } // ... Car car = new Car() { }; Car.Engine e = car.new Engine(); error: qualified new of static class Car.Engine e = car.new Engine();
  • 所以,很显然,是嵌套的接口,虽然它很难哄出来的错误信息:

    interface Car { interface Engine { } } // ... Car car = new Car() { }; class Yo implements car.Engine { } error: package car does not exist class Yo implements car.Engine { // ... class Yo implements Car.Engine { } // compiles ok.

因此,没有实例成员类,你没有路径依赖的类型,这基本上是必要的蛋糕图案。 所以,至少,不,不是以直接的方式,这是不可能的。



Answer 4:

也许你可以做这样的事情在Java中8

interface DataSource { String lookup(long id); } interface RealDataSource extends DataSource { default String lookup(long id){ return "real#"+id; } } interface TestDataSource extends DataSource { default String lookup(long id){ return "test#"+id; } } abstract class App implements DataSource { void run(){ print( "data is " + lookup(42) ); } } class RealApp extends App implements RealDataSource {} new RealApp().run(); // prints "data is real#42" class TestApp extends App implements TestDataSource {} new TestApp().run(); // prints "data is test#42"

但它绝不比平原/老办法好

interface DataSource { String lookup(long id); } class RealDataSource implements DataSource { String lookup(long id){ return "real#"+id; } } class TestDataSource implements DataSource { String lookup(long id){ return "test#"+id; } } class App { final DataSource ds; App(DataSource ds){ this.ds=ds; } void run(){ print( "data is " + ds.lookup(42) ); } } new App(new RealDataSource()).run(); // prints "data is real#42" new App(new TestDataSource()).run(); // prints "data is test#42"

Answer 5:

忽略的Java 8.0中的新功能,你可以在理论上做Java 5中使用编译时的蛋糕模式的AspectJ ITD中 。

AspectJ的DTO的让你做出的混入 。 唯一恼人的事情是,你将不得不作出两个产物:纵横(ITD)和接口。 但是场ITD让你做一些疯狂的事情想添加注释,以实现接口的类。



文章来源: Cake pattern with Java8 possible?

Recommend