Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package generics.aggregator;
- import java.lang.reflect.ParameterizedType;
- import java.math.BigDecimal;
- import java.util.HashMap;
- import java.util.Set;
- public class GenericObserver {
- public static abstract class News {
- public abstract String getHeader();
- }
- public static abstract class SportsNews extends News {
- abstract String getWinner();
- }
- public static abstract class FinancialNews extends News {
- abstract BigDecimal getStockPrice();
- }
- public static void main(String[] args) {
- Aggregator aggregator = new Aggregator();
- Subscriber<FinancialNews> financialReader = new Subscriber<FinancialNews>(){
- @Override
- public void onNews(FinancialNews news) {
- System.out.println(String.format("%s%nStock price: $%d%n%n",
- news.getHeader(), news.getStockPrice()));
- }
- };
- Subscriber<SportsNews> sportsReader = new Subscriber<SportsNews>() {
- @Override
- public void onNews(SportsNews news) {
- System.out.println(news.getWinner());
- }
- };
- aggregator.subscribe(financialReader);
- aggregator.subscribe(sportsReader);
- aggregator.dispatch(new FinancialNews(){
- @Override
- public String getHeader() {
- return "Zuckerberg sells 100k stock options";
- }
- @Override
- public BigDecimal getStockPrice() {
- return new BigDecimal("10.28");
- }
- });
- }
- public static class Aggregator {
- private HashMap<Class<?>, Set<Subscriber<? extends News>>> subscriptions;
- public <N extends News> void subscribe(Subscriber<N> subscriber) {
- ParameterizedType pt = (ParameterizedType) subscriber.getClass().getGenericSuperclass();
- Class<? extends News> klass = (Class<? extends News>) pt.getActualTypeArguments()[0];
- getSubscribersFor(klass).add(subscriber);
- }
- public <N extends News> void dispatch(N news) {
- for (Subscriber<N> subscriber: getSubscribersFor(news.getClass())) {
- subscriber.onNews(news);
- }
- }
- private <N extends News> Set<Subscriber<N>> getSubscribersFor(Class<N> klass) {
- //Set<Subscriber<N>> subscribers = subscriptions.get(news.getClass());
- //return subscribers;
- return null;
- }
- }
- public static interface Subscriber<N extends News> {
- public void onNews(N news);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement