kibar
kibar

Reputation: 824

How i can design these with abstract class

When i want to add item to favorite .. i write this code my program and access everywhere: Favorite.add(itemid);

When i want to add item to message i write this code my program and access everywhere: Message.add(itemid);

Two class have some methods. So how i can design this useful?

For example;

AbstractData.addFavorite(itemid);
AbstractData.addMessage(itemid);

or

AbstractData<Fav>.add(itemid);
AbstractData<SMS>.add(itemid);

or

Your opinion?

Thank for help and sory for my little english...

Favorite.class

public class Favorite {

    static SparseArray<Fav> LIST = new SparseArray<>();

    public static boolean add(int ID){
        if(!check(ID)){
            LIST.put(ID, new Fav(ID, DateFormat.getDateTimeInstance().format(new Date())));
            return true;
        }

        return false;
    }

    public static void remove(int ID){
        if(LIST.indexOfKey(ID) >= 0 )
            LIST.remove(ID);
    }

    public static boolean check(int ID){return LIST.get(ID) != null;}

    public static Fav get(int ID){return LIST.get(ID);}

    public static void saveALL(){
        AsyncTask.execute(new Runnable() {
            @Override
            public void run() {
                Fav favorite;
                for (int i = 0; i < LISTE.size(); i++) {
                    favorite = get(LISTE.keyAt(i));
                    if (favorite != null)
                        //Saving data to xml
                }
            }
        });
        Log.d("DONE", "Favorite LIST Saving");
    }

}

Fav.class

public class Fav implements IModel{
    private int ID;
    private String DATE;

    public Fav(int ID, String DATE) {
        this.ID = ID;
        this.DATE = DATE;
    }

    public int getID() {
        return ID;
    }

    public void setID(int ID) {
        this.ID = ID;
    }

    public String getDate() {
        return DATE;
    }

    public void setDate(String DATE) {
        this.DATE = DATE;
    }

}

Message.class

public class  Message{

    static SparseArray<SMS> LIST = new SparseArray<>();

    public static boolean add(int ID){
        if(!check(ID)){
            LIST.put(ID, new SMS(ID, DateFormat.getDateTimeInstance().format(new Date())));
            return true;
        }

        return false;
    }

    public static void remove(int ID){
        if(LIST.indexOfKey(ID) >= 0 )
            LIST.remove(ID);
    }

    public static boolean check(int ID){return LIST.get(ID) != null;}

    public static SMS get(int ID){return LIST.get(ID);}

        public static void saveALL(){
        AsyncTask.execute(new Runnable() {
            @Override
            public void run() {
                SMS message;
                for (int i = 0; i < LISTE.size(); i++) {
                    message = get(LISTE.keyAt(i));
                    if (message != null)
                        //Saving data to xml
                }
            }
        });
        Log.d("DONE", "Message LIST Saving");
    }

}

SMS.class

public class SMS implements IModel{
    private int ID;
    private String DATE;

    public SMS(int ID, String DATE) {
        this.ID = ID;
        this.DATE = DATE;
    }

    public int getID() {
        return ID;
    }

    public void setID(int ID) {
        this.ID = ID;
    }

    public String getDate() {
        return DATE;
    }

    public void setDate(String DATE) {
        this.DATE = DATE;
    }

}

IModel.class

public interface IModel {

    int getID();
    void setID(int ID);

    String getDate();
    void setDate(String DATE);

}

Upvotes: 1

Views: 63

Answers (2)

Stephan Henningsen
Stephan Henningsen

Reputation: 3783

In my opinion...

  1. Don't over-design your models.
  2. Don't make your add and remove methods static, it will eventually leave you with headaches. You want your constructor to initialize your object.
  3. Either use a Singleton Pattern to get a single instance of your manager object, or
  4. Keep your manager class as a local variable in your Application class, make an access method for it, initialize it in onCreate().
  5. Personally I've started to ditch the getter/setter pattern in favour of public fields, particularly if they're final like in enums. I know this is supposed to be ugly but... I don't care as long as it's convenient =)

So...

   public class MyApplication extends Application
   {
     private static MyApplication instance;
     private FavouritesManager favouritesManager;

     public static getMyApplicationInstance ()
     {
        return instance;
     }

     public void onCreate ()
     {
         instance = this;
         favouritesManager = new FavouritesManager(this); // You may want it to have a Context...
     }
 }


   public class FavouritesManager
   {
     private Map<Integer,Favourites> favorites;

     public FavouritesManager ()
     {
         load();
     }

     public void add ( Favourite favourite )
     {
         favourites.put(favourite.id, favourite);
     }

     public boolean contains ( int favouriteId )
     {
       favourites.contaisKey(favouriteId);
     }

     private void load ()
     {
        favourites = new HashMap<>();
        // Maybe deserialize json from SharedPreferenecs?
     }

     public List<Favorite> getAll ()
     {
        // Return all Favourites, sorted by their SortOrder.
     }

     public Favorite create ( String name )
     {
        // Maybe a factory method that generates an unused id and returns a new Favourite instance?
     }
 }


 public Favourite
 {
     public final int id;
     public final Date createDate;
     public String name;
     public int sortOrder;

     public Favorite ( int id, String name, int sortOrder )
     {
         this.id = id;
         this.createDate = Date();
         this.name = name;
         this.sortOrder = sortOrder;
     }
 }


 public class MyActivity extend Activity
 {
      protected void onCreate ( Bundle savedInstanceState )
      {
           FavouritesManager favmanager = MyApplication.getMyApplicationInstance().getFavoritesManager();
      }

 {
}

Upvotes: 1

user1438038
user1438038

Reputation: 6079

Make your classes Message and SMS implement the same interface IModel. Then, when you implement your methods (e.g. add()) and want them to accept both Message and SMS objects, use the base interface in your method signature:

public class AbstractData {

    public static void add(final IModel data) { // <- Use interface here!
      // ...
    }

}

Now you can add objects this way:

Message msg = new Message();
AbstractData.add(msg);

SMS sms = new SMS();
AbstractData.add(sms);

Upvotes: 1

Related Questions