Created
September 6, 2022 11:56
-
-
Save LukasRychtecky/620bd9acfef3bb31d777c28fe0bb09c2 to your computer and use it in GitHub Desktop.
java3.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class OrderQuery { | |
public static FilterableCollection of(Field1 field) { | |
return new FilterableByQueryField1(field); | |
} | |
public static FilterableCollection of(Field2 field) { | |
return new FilterableByQueryField2(field); | |
} | |
public static FilterableCollection of(Field3 field) { | |
return new FilterableByQueryField3(field); | |
} | |
public interface FilterableByQuery<T> { | |
Collection<T> filterBy(Field1 field1); | |
Collection<T> filterBy(Field2 field2); | |
Collection<T> filterBy(Field3 field3); | |
Collection<T> filterByQuery(FilterableCollection query); | |
} | |
public interface FilterableCollection { | |
public <T> Collection<T> filterBy(FilterableByQuery<T> filter); | |
} | |
private static class FilterableByQueryField1 implements FilterableCollection { | |
private final Field1 field; | |
private FilterableByQueryField1(Field1 field) { | |
this.field = field; | |
} | |
@Override | |
public <T> Collection<T> filterBy(FilterableByQuery<T> filter) { | |
return filter.filterBy(field); | |
} | |
} | |
private static class FilterableByQueryField2 implements FilterableCollection { | |
private final Field2 field; | |
private FilterableByQueryField2(Field2 field) { | |
this.field = field; | |
} | |
@Override | |
public <T> Collection<T> filterBy(FilterableByQuery<T> filter) { | |
return filter.filterBy(field); | |
} | |
} | |
private static class FilterableByQueryField3 implements FilterableCollection { | |
private final Field3 field; | |
private FilterableByQueryField3(Field3 field) { | |
this.field = field; | |
} | |
@Override | |
public <T> Collection<T> filterBy(FilterableByQuery<T> filter) { | |
return filter.filterBy(field); | |
} | |
} | |
} | |
// repository | |
public class OrderRepository implements OrderQuery.FilterableByQuery<Order> { | |
@Override | |
public Collection<Order> filterBy(Field1 field1) { | |
throw new RuntimeException("Not implemented"); | |
} | |
@Override | |
public Collection<Order> filterBy(Field2 field2) { | |
throw new RuntimeException("Not implemented"); | |
} | |
@Override | |
public Collection<Order> filterBy(Field3 field3) { | |
throw new RuntimeException("Not implemented"); | |
} | |
@Override | |
public Collection<Order> filterByQuery(OrderQuery.FilterableCollection query) { | |
return query.filterBy(this); | |
} | |
} | |
// usage | |
OrderQuery.FilterableCollection query = OrderQuery.of(new Field1("asdf")); | |
Collection<Order> orders = this.repository.filterByQuery(query); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment