cuốn sách gpt4 ai đã làm

Java - Cách thực hành tốt nhất cho setter/getter, setter/getter đơn hoặc nhiều setter/getter cho các biến khác nhau?

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 08:53:06 28 4
mua khóa gpt4 Nike

Tôi mới làm quen với lập trình Android (~ 2 tháng). Có cần thiết phải đặt getters cho hàng tá biến khác nhau không?

Ví dụ--

// Vâng, tôi nhận ra rằng đây không phải là 'hàng tá'
phao công khai getX() {
trả về vị trí.x;
}

phao công khai getY() {
trả về vị trí.y;
}

phao công khai getWidth() {
chiều rộng trở lại;
}

phao công khai getHeight() {
chiều cao trở lại;
}

phao công khai getRotation() {
quay trở lại;
}

Ví dụ: mặc dù cần phải sử dụng các getters và setters khác nhau cho số float và chuỗi, nhưng việc sử dụng thứ gì đó như câu lệnh switch để trả về các biến khác nhau có phải là một cách làm không tốt không? Nếu vậy thì tại sao điều này lại xảy ra?

public float returnSomething(String theThing) {
chuyển đổi (theThing) {
trường hợp "chiều cao":
chiều cao trở lại;
trường hợp "xoay":
quay trở lại;
trường hợp "chiều rộng":
chiều rộng trở lại;

default:
return 0;
}
}

Vì vậy, đoạn mã trên có bị coi là sai không? Nếu vậy, hãy giải thích tại sao.

Cảm ơn sự giúp đỡ, đây thực sự không phải là vấn đề vì cả hai cách tiếp cận đều sẽ hoạt động tốt, tôi chỉ không hiểu tại sao mọi người lại sử dụng hàng tá getters và setters mà không có lý do chính đáng.

Tôi đoán vấn đề tương tự cũng áp dụng cho người định cư

câu trả lời hay nhất

Bởi vì khi bạn làm điều gì đó như

public float returnSomething(String theThing) {
chuyển đổi (theThing) {
trường hợp "chiều cao":
chiều cao trở lại;
trường hợp "xoay":
quay trở lại;
trường hợp "chiều rộng":
chiều rộng trở lại;

default:
return 0;
}
}

Tôi có thể cảm nhận được câu hỏi tiếp theo trên Stack Overflow,"Tại sao chiều cao của tôi luôn bằng 0?"

Sau đó đăng mã như thế này

lớp công khai GameThingy {
//...

khoảng trống riêng tư doStuff(GameObject gameObject) {
trọng lực nổi = 5*gameObject.returnSomething("hieght");
gameObject.setSomething("vận tốc", trọng lực+50);
}
}

Về mặt kỹ thuật, một khi bạn mắc lỗi đánh máy ở bất kỳ đâu, bạn sẽ gặp khó khăn trong việc tìm ra nguồn gốc của vấn đề. Chà, bạn thật may mắn, những lĩnh vực này float , họ không cần phải như vậy.

biên tập: Nhân tiện, đây thực sự là một vấn đề điển hình khi xác định các trường quan tâm trong một số truy vấn cơ sở dữ liệu. Giống như, phải vượt qua String Chỉ định trường bạn muốn tìm.

Ví dụ thực tế cuộc sống là Vương quốc .

MỘT Vương quốc看起来像这样:

RealmQuery query = Realm.where(User.class);

//Thêm điều kiện truy vấn:
query.equalTo("name", "John");

// Thực hiện truy vấn:
RealmResults result1 = query.findAll();

họ học lớp ở đâu User是这样的:

lớp công khai Người dùng {
tên chuỗi riêng tư;

Chuỗi công khai getName() {
trả lại tên;
}

public void setName(Tên chuỗi) {
this.name = tên;
}
}

Một lưu ý thú vị là Realm tạo một "lớp con proxy" nơi họ xác định lại tên tập hợplấy tênCác phương thức (hay còn gọi là bạn cần getters/setters để làm cho một số hệ thống hoạt động! Họ cho rằng bạn có chúng!)

Nhưng điều quan trọng ở đây là bạn cần cung cấp tên trường "name" .

Sau đó,Bất cứ ai cũng có thể mắc lỗi đánh máy, hoặc bạnNhững trường này sẽ không được ghi nhớ. Trong trường hợp cụ thể này, họ có xu hướng tạo ra mộtsiêu mẫu(thứ gì đó lưu trữ tên trường cho bạn) để bạnKhông cần sử dụng chuỗiđể tham chiếu tên trường.

Ví dụ: trong API tiêu chí, thay vì

Root pet = cq.from(Pet.class);
cq.select(pet.get("tên"));

Họ có mô hình meta này:

Root pet = cq.from(Pet.class);
cq.select(pet.get(Pet_.name));

Vì vậy, nó loại bỏ String nhu cầu

Một lần nữa, tôi có xu hướng sử dụng Realm để tạo một "siêu mô hình" (mặc dù bây giờ bạn có thể sử dụng Trình trợ giúp RealmFieldNames tự động tạo nó cho bạn):

public class User
mở rộng RealmObject {
@PrimaryKey
id dài riêng tư;
tên chuỗi riêng tư;

Các trường enum tĩnh công khai { // đây là "siêu mô hình"
ID("id"),
TÊN("tên");

tên trường chuỗi riêng tư;

Các trường(Tên trường chuỗi) {
this.fieldName = fieldName;
}

Chuỗi công khai getField() {
trả về tên trường;
}

@Ghi đè
Chuỗi công khai toString() {
trả về getField();
}
}
}

Vì vậy, bạn có thể thay thế truy vấn như thế này

RealmResults result2 = Realm.where(User.class)
.equalTo(User.Fields.NAME.getField(), "John")
.hoặc()
.equalTo(User.Fields.NAME.getField(), "Peter")
.findAll();

Nhưng với getters và setters, bạn đã có sự an toàn về kiểu và bạn đã có các phương thức mà bạn không cần phải nhớ - vì vậy bạn phải kiểm tra lỗi trong thời gian biên dịch.

Vì vậy, để trả lời câu hỏi của bạn, lý do việc tham chiếu một biến theo tên chuỗi trong Java là một cách làm không tốt là vì

1.) Lỗi chính tả có thể xảy ra, lỗi chỉ xảy ra ởthời gian chạy, thay vì thời gian biên dịch

2.)gõ không an toàn;bạn thật may mắn khi nhận đượcfloat Mặt sau của nó không quan trọng trong ví dụ này, nhưng bây giờ nó có thể String , bạn cần quay lại Objectvà chuyển đổi hoặc sử dụng công khai T get(Trường chuỗi) { ... }Và bất cứ ai gọi phương thức này đều phải biết chính xác những gì họ đang nhận được - cũng dễ xảy ra lỗi thời gian chạy.

Về Java - Các phương pháp hay nhất cho setter/getters, setter/getter đơn hoặc nhiều setter/getters cho các biến khác nhau? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/31517799/

28 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress