Về biến return và cách hoạt động?

  • Mình có đoạn code như sau:
Rectangle body;
public Hero() {
        x = Values.SCREEN_WIDTH/5;
        y = Values.SCREEN_HEIGHT/5;
        body = new Rectangle(x, y, Values.Hero_Width, Values.Hero_Height);
        state = HeroState.Walking_Forward;
    }
    public Rectangle getBody() {
        return body;
    }
  • Hàm getBody() ở đây sẽ trả về giá trị là biến body trong hàm hero() phải ko m.n nhỉ? Mình thấy nhiều bạn code kiểu này nhưng mình ko hiểu cách nó hoạt động ra sao nữa. Mong m.n khai sáng giúp mình =))
3 Likes

hàm getBody() ở đây là getter, trả về giá trị hiện tại của biến nào đó được khai báo trong class.
Ví dụ bạn khởi tạo class, sau đó gọi getBody thì nó sẽ trả về giá trị được khởi tạo trong constructor. Sau đó bạn thay đổi giá trị của biến body, getBody sẽ trả về giá trị mà bạn đã thay đổi

8 Likes

theo mình nghĩ thì khi instance được tạo từ class Hero thì body được constructor set giá trị rồi nên khi gọi method getBody() thì body có giá trị của constructor đã tạo

3 Likes

return chỉ dễ hiểu khi không có exception thôi :v

5 Likes

Ví dụ mình có hai cách code như sau. Cách 1 không dùng getter và cách 2 thì có.
Cách 1

class Hero {
    Rectangle body;
}
...
Hero h = new Hero();
h.body;    // Here

Cách 2

class Hero {
    private Rectangle body;
    public Rectangle getBody() {
        return body;
    }
}
...
Hero h = new Hero();
h.getBody();    // Here

Bạn chưa hiểu tại sao người ta thường dùng cách 2 mà không dùng cách 1 phải không?
Cách 1 có nhược điểm là đặt body là công khai, nên có thể bị truy cập từ bất cứ đâu. Cách 2 đặt private body nên không truy cập trực tiếp được, mà phải thông qua getter là getBody (public).
Ở trên code bạn trường body chưa được đặt private nên getter gần như vô dụng.
Việc này giúp kiểm soát được luồng dữ liệu đi ra từ class, muốn lấy dữ liệu body bắt buộc phải sử dụng getBody. Nếu bạn không thích thì getBody có thể return null, hoặc sửa đổi lại body trước khi return, dữ liệu đưa ra ngoài có thể được kiểm soát.

6 Likes

thế có thêm exception thì nó không dễ hiểu ntn :slight_smile:
lỡ lấy tay chỉ trăng thì chỉ cho rõ luôn đi bạn chuột đáng yêu :stuck_out_tongue:

4 Likes

Đúng rồi, mình cũng thắc mắc tại sao có thêm exception thì khó hiểu.

1 Like

Hay nhỉ! Có 1 số người họ chỉ để mỗi return; mà ko để trị số nào cả. Mình down code của người khác về tham khảo mà ko hiểu gì =)))

Exception mình chưa thấy trong phần return như thế nào và để làm gì nữa :v

Theo cách hiểu thông thường thì khi gặp return thì method kết thúc và trở về calling method.

Nhưng gặp finally của exception thì nó chạy khác:

public class Example {
    public int foo() {
        try {
            System.out.println("foo(): try block");     // 1.1
            return 1;                                   // 1.2
        } finally {
            System.out.println("foo(): finally block"); // 1.3
        }
    }

    public int bar() {
        try {
            System.out.println("bar(): try block");     // 2.1
            return 1;                                   // 2.2
        } finally {
            System.out.println("bar(): finally block"); // 2.3
            return 2;                                   // 2.4
        }
    }
}

Về Example.foo(), nó sẽ chạy thêm 1 lệnh trong finally: 1.1 -> 1.2 (return) -> 1.3.
Method thông thường thì chỉ chạy 2 lệnh, đến lệnh return ở 1.2 là dừng, nhưng với foo() có finally nên phải chạy thêm 1.3 nữa.

Còn Example.bar(), thứ tự chạy:

  • 2.1 -> 2.2 (return) -> 2.3 -> 2.4 (return)

Ngoài chạy thêm 2 lệnh trong finally sau 2.2, method còn bỏ luôn giá trị trả về của 2.2 mà chỉ lấy giá trị return của 2.4. Như trong method bar(), giá trị trả về sẽ là 2 thay vì là 1.

Và khó khăn hơn là khi có luôn cả catchfinally, return nào bị bỏ qua? (return trong try? hay bỏ return trong catch?)

class Example {
    public int call() {
        try {
            if (...) throw new Ex1(...);
            if (...) throw new Ex2(...);
            ...
            return 1;
        catch (Ex1 e) {
            ...
            return 2;
        catch (Ex2 e) {
            ...
            return 3;
        }        
        ...
        finally {
            ...
            if (...) return -1;
            ...
        }
    }   
}
6 Likes

Thanks Chuột nha.

Mình nghĩ vấn đề này nếu hiểu là finally luôn luôn được excute bất kể có exception hay không thì sẽ ko bị confuse.

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