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 SharedPreferences và SharedPreferences.Editor là public 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 ạ ?

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

Trong phương thức getSharedPreferences và edit 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ì.

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 ạ

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

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. :smiling_imp:

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

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?