Bạn có sử dụng StringUtils.EMPTY
thay vì ""
?
Ý tôi là ở dạng giá trị trả về hoặc nếu bạn đặt giá trị của một biến Chuỗi. Tôi không có ý so sánh, vì ở đó chúng tôi sử dụngStringUtils.isEmpty()
Câu trả lời:
Dĩ nhiên là không. Bạn có thực sự nghĩ rằng "" không đủ rõ ràng?
Hằng số về cơ bản có 3 trường hợp sử dụng:
Không áp dụng ở đây.
EMPTY
không mang bất kỳ ý nghĩa nào mà bản thân chuỗi trống chưa có. Đáng chú ý nhất, nó không ghi lại lý do tại sao bạn quyết định sử dụng một chuỗi rỗng trong trường hợp cụ thể đó. Việc đặt tên cho một hằng số ONE
và giả vờ rằng có một điểm trong việc sử dụng hằng số đó thay vì giá trị.
Tôi sử dụng StringUtils.EMPTY
, để ẩn nghĩa đen và cũng để thể hiện điều đó return StringUtils.EMPTY
hoàn toàn được mong đợi và sẽ trả về một chuỗi trống, ""
có thể dẫn đến giả định ""
có thể dễ dàng thay đổi thành một thứ khác và đây có thể chỉ là một sai lầm. Tôi nghĩ EMPTY
là biểu cảm hơn.
StringUtils.EMPTY
ít biểu cảm hơn ""
.
""
cách diễn đạt hơn là sử dụng StringUtils.EMPTY
, và những gì bạn đã nói đã không thay đổi suy nghĩ của tôi về điều đó. Tôi chỉ có thể tin rằng các nhà phát triển đã viết sai một chuỗi rỗng rất, rất thỉnh thoảng - nhưng tôi sẽ xem xét sự rõ ràng của chuỗi ký tự trên một lần trong một triệu (và dễ dàng tìm thấy trong thử nghiệm, hy vọng ... ) lỗi, cá nhân.
Không, chỉ cần sử dụng ""
.
Chữ ""
rõ ràng như pha lê. Không có sự hiểu lầm nào về ý nghĩa của nó. Tôi sẽ không biết tại sao bạn cần một hằng số lớp cho điều đó. Tôi chỉ có thể giả định rằng hằng số này được sử dụng trong toàn bộ gói chứa StringUtils
thay vì ""
. Tuy nhiên, điều đó không có nghĩa là bạn nên sử dụng nó.
Nếu có một tảng đá trên vỉa hè, bạn không cần phải ném nó.
Tôi ngạc nhiên về việc có bao nhiêu người hài lòng khi cho rằng "" thực sự là một chuỗi rỗng và không (vô tình?) Chứa bất kỳ ký tự vô hình và không khoảng cách tuyệt vời nào của Unicode. Vì tình yêu của tất cả những gì tốt đẹp và tử tế, hãy sử dụng EMPTY bất cứ khi nào bạn có thể.
Tôi sẽ thêm hai xu của mình ở đây vì tôi không thấy ai nói về việc String
thực tập và khởi tạo Lớp học:
String
các chữ trong các nguồn Java được thực tập nội trú, làm cho bất kỳ ""
và StringUtils.EMPTY
các giống đối tượngStringUtils.EMPTY
có thể khởi tạo StringUtils
lớp, vì nó chỉ truy cập vào thành viên tĩnh của nó EMPTY
nếu nó không được khai báofinal
(JLS là cụ thể về điểm đó). Tuy nhiên, là cuối cùng, vì vậy nó sẽ không khởi tạo lớp.org.apache.commons.lang3.StringUtils.EMPTY
Xem câu trả lời liên quan về Thực hiện chuỗi và Khởi tạo lớp , tham khảo JLS 12.4.1 .
StringUtils
lớp.
Tôi không thực sự thích sử dụng nó, vì return "";
nó ngắn hơn return StringUtils.EMPTY
.
Tuy nhiên, một lợi thế sai của việc sử dụng nó là nếu bạn nhập return " ";
thay vì return "";
, bạn có thể gặp phải các hành vi khác (liên quan đến việc bạn có kiểm tra chính xác một Chuỗi trống hay không).
""
, tôi ghét phải gõ cùng một chuỗi chữ nhiều hơn một lần, thậm chí đôi khi chỉ một lần. Tôi muốn khai báo các hằng số trong Constants.java , nhưng không lặp lại chúng ở mọi nơi trong mã nguồn.
return "";
là xấu xí, TÔI ƯU ĐÃI sử dụng return StringUtil.EMPTY
(được khai báo trong lớp StringUtil của riêng tôi , KHÔNG PHẢI là StringUtils của Apache ).
Nếu lớp của bạn không sử dụng bất kỳ thứ gì khác từ dấu phẩy thì sẽ thật tiếc nếu có sự phụ thuộc này chỉ cho giá trị ma thuật này.
Nhà thiết kế của StringUtils sử dụng rất nhiều hằng số này và đó là điều đúng đắn nên làm, nhưng điều đó không có nghĩa là bạn cũng nên sử dụng nó.
Thành thật mà nói, tôi cũng không thấy sử dụng nhiều. Nếu bạn muốn so sánh ví dụ với một chuỗi trống, chỉ cần sử dụngStringUtils.isNotEmpty(..)
StringUtils.isNotEmpty(..)
cũng thực hiện kiểm tra null nên nó không hoàn toàn giống như so sánh với một chuỗi rỗng.
null
như thế nào? như đối số thứ 2 của equals
, nhưng kết quả sẽ giống nhau -false
isNotEmpty
là trái ngược với "".equals(…)
, do đó, thực tế là nó sẽ đối xử null
như chuỗi rỗng là khác nhau để so sánh với một chuỗi rỗng, "".equals("")
→ true
,"".equals(null)
→ false
, StringUtils.isNotEmpty("")
→ false
, StringUtils.isNotEmpty(null)
→ false
. Nếu bạn chỉ muốn biết liệu một chuỗi rỗng, sử dụng string.isEmpty()
, trong đó có hành vi phải trở về true
khi và chỉ khi nó là một chuỗi rỗng và ném một NullPointerException
nếu chuỗi là null
...
Tôi thấy StringUtils.EMPTY
hữu ích trong một số trường hợp để dễ đọc. Đặc biệt với:
Toán tử bậc ba, ví dụ.
item.getId() != null ? item.getId() : StringUtils.EMPTY;
Cũng bằng cách sử dụng một hằng số, một tham chiếu tới StringUtils.EMPTY
được tạo ra. Mặt khác, nếu bạn cố gắng khởi tạo chuỗi ký tự ""
mỗi lần JVM sẽ phải kiểm tra xem nó đã tồn tại trong nhóm chuỗi chưa (mà nó có thể sẽ xảy ra, vì vậy không có chi phí tạo phiên bản bổ sung). Chắc chắn khi sử dụng StringUtils.EMPTY
tránh phải kiểm tra String pool?
StringUtils.EMPTY
hằng số được giải quyết tại thời điểm biên dịch.
StringUtil.EMPTY
là một hằng số thời gian biên dịch, một tham chiếu đến nó được biên dịch thành mã bytec chính xác giống như khi sử dụng ""
trực tiếp. Hơn nữa, tôi không hiểu tại sao toán tử bậc ba nên tạo ra bất kỳ sự khác biệt nào. Đó là một biểu hiện giống như bất kỳ biểu hiện nào khác. Bất kỳ lý do nào để sử dụng hoặc không sử dụng hằng số được đặt tên cũng áp dụng cho toán tử bậc ba.
Không, vì tôi còn nhiều thứ để viết. Và một Chuỗi trống là rỗng độc lập plattform (trong Java).
File.separator
tốt hơn "/" hoặc "\".
Nhưng hãy làm như bạn thích. Bạn không thể mắc lỗi đánh máy nhưreturn " ";
someString.isEmpty()
thay thế.
Vâng, nó có ý nghĩa. Đó có thể không phải là cách duy nhất để đi nhưng tôi có thể thấy rất ít trong cách nói "không có ý nghĩa" này.
Theo ý kiến của tôi:
It will still require changing everywhere if you don't define your own variable and use it in multiple places.
bạn sẽ thay đổi một chuỗi rỗng thành một chuỗi rỗng khác?
StringUtils.EMPTY
. Nó làm rõ rằng việc sử dụng Chuỗi trống là có chủ đích chứ không phải do lười biếng nào đó ("Ồ, cái này yêu cầu Chuỗi, hãy vượt qua""
"). Nếu ai đó nhấn đoạn mã này, anh ta sẽ suy nghĩ kỹ trước khi thực hiện thay đổi. Ngoài ra, nếuStringUtils.EMPTY
được xác định là biến của riêng bạn, chẳng hạn nhưMyClass.EMPTY
, việc thực hiện thay đổi đối với "đại diện cho sự trống rỗng" sẽ yêu cầu thay đổi một dòng mã. Ví dụ: bạn có thể thay đổi nó thành"<empty>"
thay vì Chuỗi trống""
. Nhưng, tôi nghĩ rằng điều này đã đi hơi quá xa.