01/10/2018, 17:18

Hỏi về SharedPreferences trong android

SharedPreferences sharedPreferences = getSharedPreferences(
    SHARED_PREFERENCES_NAME,
    Context.MODE_PRIVATE
);
SharedPreferences.Editor editor = sharedPreferences.edit();

Ac cho e hỏi . e tra trên trang android.developer thì SharedPreferences là phương thức public interface SharedPreferencesSharedPreferences.Editorpublic static interface SharedPreferences.Editor thì sao lại khởi tạo được Đối tượng “biến” bằng cách này được ạ ?

Theo như trang thangcoder.com hướng dẫn ạ ?

Trương Tấn Phát viết 19:20 ngày 01/10/2018

Bạn nói là khởi tạo! Thế từ khóa new ở đâu?

Trong phương thức getSharedPreferencesedit nó sẽ khởi tạo một lớp con của 2 lớp giao tiếp (interface) này và trả về cho bạn xử lý.
2 lớp con này thường thì sẽ được giấu bên trong lớp chứa 2 phương thức đó.
Nếu bạn dùng reflection để lấy tên lớp của đối tượng trả về, bạn sẽ biết thực sự nó là gì.

Bùi Gia Anh viết 19:24 ngày 01/10/2018

dạ trang thangcode.com hướng dẫn là " khởi tạo đối tượng ( biến ) đó ạ " e đã chụp ảnh ạ . cơ mà e đnag thắc mắc là khởi tạo mà lại không có new nên đang hỏi ạ

Quân viết 19:30 ngày 01/10/2018

Thật ra khởi tạo cũng không hoàn toàn sai vì khi gọi method đó thì code bên dưới sẽ tạo 1 đối tượng có kiểu là SharedPreferences hoặc lấy từ cache gửi lại cho bạn. Khởi tạo là tạo 1 object nào đó. Không nhất thiết phải dùng new gọi constructor thì mới gọi là khởi tạo

Trương Tấn Phát viết 19:22 ngày 01/10/2018

Ví dụ luôn nhé:

// ===Creature.java===
// Giống với SharedPreferences và SharedPreferences.Editor
public interface Creature {
   public String live();
// Các phương thức cần triển khai khác...
}



// ===CreatureFactory.java===
public class CreatureFactory{
   final public static int HUMAN =0;
   final public static int APE =1;
   final public static int FISH =2;

   // Phương thức tương tự với
   // getSharedPreferences và edit
   public static Creature getCreature(int type){
      Creature r;
      switch(type){
         case HUMAN:
            r = new Human();
            break;
         case APE:
            r = new Ape();
            break;
         case FISH:
            r = new Fish();
            break;
         // có thể có ngoại lệ
         // làm cho vui thôi
         default:
            r = new UnCreature();
            break;
      }
      return r;
   }
   // Các lớp con triển khai từ Creature nằm trong CreatureFactory,
   // không truy xuất từ bên ngoài được
   // Human
   private class Human implements Creature{
      public Human(){} // Hàm dựng.
      @Override public String live(){
         return "This is a human";
      }
      // Triển khai các phương thức khác của Creature
   }

   // Ape
   private class Ape implements Creature{
      public Ape(){} // Hàm dựng.
      @Override public String live(){
         return "This is an ape";
      }
      // Triển khai các phương thức khác của Creature
   }

   // Fish
   private class Fish implements Creature{
      public Fish(){} // Hàm dựng.
      @Override public String live(){
         return "This is a fish";
      }
      // Triển khai các phương thức khác của Creature
   }

   // UnCreature
   // Chỉ vui thôi :)
   private class UnCreature implements Creature{
      public UnCreature(){} // Hàm dựng.
      @Override public String live(){
         return "What is this creature?";
      }
      // Triển khai các phương thức khác của Creature
   }
}

// ===Test.java===
public class Test{
// Phần chúng ta sử dụng nhé
// không có new gì hết nhé.
   public static void main(String[] args){
      Creature hm =  CreatureFactory.getCreature(CreatureFactory.HUMAN);
      Creature ap =  CreatureFactory.getCreature(CreatureFactory.APE);
      Creature fi =  CreatureFactory.getCreature(CreatureFactory.FISH);
      System.out.println(hm.live());
      System.out.println(ap.live());
      System.out.println(fi.live());
   }
}

Kết quả:

This is a human
This is an ape
This is a fish

Viết không dùng IDE nên có thể có lỗi cú pháp, ai thấy thì bỏ qua cho mình

Bằng điện thoại.

Quân viết 19:33 ngày 01/10/2018

public interface Creature { public String live(){} // Các phương thức cần triển khai khác… }

interface chỉ khai báo method signature thôi.

Bài liên quan
0