Chúng tôi đang triển khai bộ điều hợp cho Jaxen (thư viện XPath cho Java) cho phép chúng tôi sử dụng XPath để truy cập mô hình dữ liệu của ứng dụng.
Điều này được thực hiện bằng cách triển khai các lớp ánh xạ các chuỗi (được truyền cho chúng tôi từ Jaxen) thành các phần tử của mô hình dữ liệu của chúng tôi. Chúng tôi ước tính chúng tôi sẽ cần khoảng 100 lớp với tổng số hơn 1000 chuỗi so sánh.
Tôi nghĩ rằng cách tốt nhất để làm điều này là đơn giản nếu / khác phát biểu với các chuỗi được viết trực tiếp vào mã - thay vì xác định mỗi chuỗi là một hằng số. Ví dụ:
public Object getNode(String name) {
if ("name".equals(name)) {
return contact.getFullName();
} else if ("title".equals(name)) {
return contact.getTitle();
} else if ("first_name".equals(name)) {
return contact.getFirstName();
} else if ("last_name".equals(name)) {
return contact.getLastName();
...
Tuy nhiên, tôi luôn được dạy rằng chúng ta không nên nhúng các giá trị chuỗi trực tiếp vào mã mà thay vào đó hãy tạo các hằng chuỗi. Điều đó sẽ trông giống như thế này:
private static final String NAME = "name";
private static final String TITLE = "title";
private static final String FIRST_NAME = "first_name";
private static final String LAST_NAME = "last_name";
public Object getNode(String name) {
if (NAME.equals(name)) {
return contact.getFullName();
} else if (TITLE.equals(name)) {
return contact.getTitle();
} else if (FIRST_NAME.equals(name)) {
return contact.getFirstName();
} else if (LAST_NAME.equals(name)) {
return contact.getLastName();
...
Trong trường hợp này tôi nghĩ đó là một ý tưởng tồi. Hằng số sẽ chỉ được sử dụng một lần, trong getNode()
phương thức. Sử dụng các chuỗi trực tiếp cũng dễ đọc và dễ hiểu như sử dụng các hằng số, và giúp chúng ta tiết kiệm ít nhất một nghìn dòng mã.
Vì vậy, có bất kỳ lý do để xác định hằng chuỗi cho một lần sử dụng? Hoặc có thể chấp nhận sử dụng chuỗi trực tiếp?
Tái bút Trước khi bất cứ ai đề nghị sử dụng enum thay vào đó, chúng tôi đã tạo ra mẫu đó nhưng việc chuyển đổi enum chậm hơn 15 lần so với so sánh chuỗi đơn giản để nó không được xem xét.
Kết luận: Các câu trả lời dưới đây đã mở rộng phạm vi của câu hỏi này ngoài các hằng chuỗi, vì vậy tôi có hai kết luận:
- Có thể sử dụng chuỗi trực tiếp thay vì hằng chuỗi trong kịch bản này, nhưng
- Có nhiều cách để tránh sử dụng chuỗi, có thể tốt hơn.
Vì vậy, tôi sẽ thử kỹ thuật bao bọc để tránh các chuỗi hoàn toàn. Thật không may, chúng tôi không thể sử dụng câu lệnh chuyển đổi chuỗi vì chúng tôi chưa có trên Java 7. Cuối cùng, mặc dù, tôi nghĩ rằng câu trả lời tốt nhất cho chúng tôi là thử từng kỹ thuật và đánh giá hiệu suất của nó. Thực tế là nếu một kỹ thuật rõ ràng nhanh hơn thì có lẽ chúng ta sẽ chọn nó bất kể vẻ đẹp hay sự tuân thủ quy ước của nó.
switch
nhãn. Sử dụng một công tắc thay vì if
thác.