Advertisement
raffaele181188

Generics Java News Aggregator

Oct 23rd, 2012
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.25 KB | None | 0 0
  1. package generics.aggregator;
  2.  
  3. import java.lang.reflect.ParameterizedType;
  4. import java.math.BigDecimal;
  5. import java.util.HashMap;
  6. import java.util.Set;
  7.  
  8. public class GenericObserver {
  9.  
  10.     public static abstract class News {
  11.         public abstract String getHeader();
  12.     }
  13.    
  14.     public static abstract class SportsNews extends News {
  15.         abstract String getWinner();
  16.     }
  17.    
  18.     public static abstract class FinancialNews extends News {
  19.         abstract BigDecimal getStockPrice();
  20.     }
  21.    
  22.     public static void main(String[] args) {
  23.         Aggregator aggregator = new Aggregator();
  24.        
  25.         Subscriber<FinancialNews> financialReader = new Subscriber<FinancialNews>(){
  26.  
  27.             @Override
  28.             public void onNews(FinancialNews news) {
  29.                 System.out.println(String.format("%s%nStock price: $%d%n%n",
  30.                         news.getHeader(), news.getStockPrice()));
  31.             }
  32.            
  33.         };
  34.  
  35.         Subscriber<SportsNews> sportsReader = new Subscriber<SportsNews>() {
  36.  
  37.             @Override
  38.             public void onNews(SportsNews news) {
  39.                 System.out.println(news.getWinner());
  40.             }
  41.            
  42.         };
  43.        
  44.         aggregator.subscribe(financialReader);
  45.         aggregator.subscribe(sportsReader);
  46.        
  47.         aggregator.dispatch(new FinancialNews(){
  48.  
  49.             @Override
  50.             public String getHeader() {
  51.                 return "Zuckerberg sells 100k stock options";
  52.             }
  53.  
  54.             @Override
  55.             public BigDecimal getStockPrice() {
  56.                 return new BigDecimal("10.28");
  57.             }
  58.         });
  59.        
  60.        
  61.     }
  62.  
  63.     public static class Aggregator {
  64.        
  65.         private HashMap<Class<?>, Set<Subscriber<? extends News>>> subscriptions;
  66.        
  67.         public <N extends News> void subscribe(Subscriber<N> subscriber) {
  68.             ParameterizedType pt = (ParameterizedType) subscriber.getClass().getGenericSuperclass();
  69.             Class<? extends News> klass = (Class<? extends News>) pt.getActualTypeArguments()[0];
  70.             getSubscribersFor(klass).add(subscriber);
  71.         }
  72.        
  73.         public <N extends News> void dispatch(N news) {
  74.             for (Subscriber<N> subscriber: getSubscribersFor(news.getClass())) {
  75.                 subscriber.onNews(news);
  76.             }
  77.         }
  78.        
  79.         private <N extends News> Set<Subscriber<N>> getSubscribersFor(Class<N> klass) {
  80.             //Set<Subscriber<N>> subscribers = subscriptions.get(news.getClass());
  81.             //return subscribers;
  82.             return null;
  83.         }
  84.     }
  85.    
  86.     public static interface Subscriber<N extends News> {
  87.         public void onNews(N news);
  88.     }
  89.    
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement