Hỏi về static method và instance method

Mình có vấn đề này đang phân vân là nên dùng static method hay instance method đu kết quả như nhau:

MyClass.staticMethod();

MyClass obj = new MyClass();//Create an instance
obj.nonstaticMethod();

Vậy khi nào nên dùng static method, khi nào nên dùng instance method?
Cám ơn mọi người.

Hi Sy,

Tớ list dưới đây các trường hợp mà tớ nhớ ra khi sử dụng static method & instance method. Nếu có gì cần bổ sung, mọi người bổ sung giúp tớ nhé!

Đây là các trường hợp cậu nên sử dụng instance method:

  • Khi method đó là hành vi của 1 object. 1 chiếc xe đạp có thể chạy được -> “chạy được” là hành vi.
  • Khi cậu có áp dụng đa hình. Hiển nhiên rồi phải ko? :slight_smile:
  • Khi cậu cần trừu tượng hóa các hành vi của object. Cậu không thể làm điều đó với static method.
  • Khi cậu muốn đóng gói các hành vi của 1 object. Static method không cần tới object để thực thi, vậy nên nó không thể đại diện cho hành vi của 1 object được.

Đây là các trường hợp cậu nên sử dụng static method:

  • Khi cậu cần hiệu năng cao.
  • Khi cậu phải maintain code toàn sử dụng static method.
  • Khi cậu cần viết utility function - các hàm tiện ích không thuộc về bất cứ object nào.
  • Khi cậu sử dụng procedure programming ở Java/C#
  • Khi method của cậu viết ra đại diện cho toàn bộ class. Cậu có thể gặp điều này khi implement 1 số design pattern như Singleton, Factory, Builder.

Nhìn chung, nếu cậu áp dụng OOP, nhìn chung, cậu nên sử dụng instance method càng nhiều càng tốt (cậu có thể thấy tất cả các tính chất của OOP trong instance method).
Tuy cá nhân tớ không khuyến khích sử dụng static method, vì thường nó sẽ phá vỡ tính chất đóng gói, nhưng đôi khi, 1 vài class Utils hoặc 1 vài static method sẽ giúp cho implement của cậu đỡ phức tạp đi rất nhiều. Vậy nên, cậu có thể cân nhắc :slight_smile:

Hi vọng câu trả lời của tớ giúp cậu.

10 Likes

Tks bạn rất nhiều :grinning:

2 Likes

Dạ có phải static đại diện cho cái tổng thể, tất cả instance tạo ra từ class đều dùng chung biến và hàm static hoặc static nó chỉ thuộc về class nên không liên quan đến từng instance cụ thể nào cả nên static mang nghĩa rộng? (em nghe hơi giống định nghĩa Prototype trong javascript nhỉ)
Còn method trong instance là của cá nhân từng object (đã được cụ thể hóa), nó có thể được đóng gói (encapsulation) nên biến static bên ngoài không truy cập được?

public class Car {

    String name;

    Car(String carName){
        this.name = carName;
    }

    //oto con phổ thông luôn luôn có 4 bánh nên đặt hàm này là static
    public static int getNumberOfWheels(){
        return 4;
    }
     //Mỗi instance xe sẽ có mỗi trạng thái khác nhau
    public String getStatus(){
        return this.name + " is running on " + getNumberOfWheels() + " wheels";
    }

    public static void main(String[] args) {
            Car toyota = new Car("toyota");
            System.out.println(toyota.getStatus());
    }
}
2 Likes

Ừ cậu, cậu hiểu concept cơ bản rồi đó.
Về mặt thuật ngữ, cậu sẽ gọi đó là “static member” của class (thành viên tĩnh của class). Cậu không cần tạo thể hiện của class (a.k.a tạo object) để truy cập static properties hay triệu hồi static methods.

Tớ đoán cậu muốn nói tới “method static không truy cập được method thường”.
Cậu cũng hiểu logic cơ bản concept rồi đó.
Tường minh hơn về mặt cài đặt, cậu cần biết classes’ static members sẽ được JVM (class loader) load cùng thời điểm với class (lúc đó, không có instance nào của class đó được tạo ra). Thế nên, static member không thể gọi được, hay truy cập được vào non-static method/property (vì nó chưa tồn tại).

Hope it helps!

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