Ho questo problema:   Class1    e   Class2    sono dello stesso tipo   Base   . Rappresentano lo stesso concetto ma con un'implementazione leggermente diversa. Se li modifico "nel modo giusto" in Java, avrei qualcosa del genere: 
abstract class Base{
    public int id;
    public abstract void someLogic();
}
class Class1 extends Base{
    List<Content> contents;
    @Override
    public void someLogic() {}
}
class Class2 extends Base{
    public Map<CategoryId, Category> categoryMap;
    @Override
    public void someLogic() {}
}
class CategoryId{
    int id;
}
class Category{
    CategoryId id;
    List<Content> contents;
}
class Content{
}
Il problema con questo design è che ho più classi da mantenere rispetto al seguente approccio:
class Base{
    public int id;
    //WE KNOW IT IS Class1 IF CategoryId==null
    public Map<CategoryId, Category> categoryMap;
    public void someLogic(){}
}
class CategoryId{
    int id;
}
class Category{
    CategoryId id; //WILL ALWAYS BE NULL IF IN Class1 Map
    List<Content> contents;
}
class Content{
}
 Nell'approccio successivo, in realtà ho   CategoryId    sempre   null    per   Class1    caso e per   Class2    caso è istanza effettiva di   CategoryId   . Questo è probabilmente più illeggibile e incomprensibile, ma mantiene il codice più pulito. 
Quale design è migliore? Qualche altra implementazione (alternativa)? Grazie.