StringUtils.EMPTY có được khuyến nghị không?


91

Bạn có sử dụng StringUtils.EMPTYthay 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:


111

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:

  1. Ghi lại ý nghĩa của một giá trị (với tên hằng + javadoc)
  2. Đồng bộ hóa các máy khách trên một giá trị chung.
  3. Cung cấp lối tắt đến một giá trị đặc biệt để tránh một số chi phí bắt buộc

Không áp dụng ở đây.


33
Tôi vẫn thấy một trường hợp sử dụng nhỏ và hiếm gặp 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ếu StringUtils.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.
Timmos

5
Cuối cùng, tôi có một số lý lẽ lành mạnh để chuyển tiếp những người sốt sắng đến, thay vì luôn tự suy nghĩ. Cảm ơn.
Alex

2
Làm thế nào để EMPTY thiếu ý nghĩa? EMPTY đáp ứng cả 1 và 2 trong danh sách của bạn. Các nhà phát triển có kinh nghiệm đang đánh giá thấp tiềm năng của các nhà phát triển cấp dưới làm sai một thứ đơn giản như sử dụng "".
Andrew T Finnell

4
@AndrewTFinnell tên EMPTYkhô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ố ONEvà giả vờ rằng có một điểm trong việc sử dụng hằng số đó thay vì giá trị.
Holger

6
Bỏ phiếu xuống chỉ vì, không, tôi thực sự không nghĩ "" đủ rõ ràng :( Có trống không? Có trống không? Có khoảng trống trong đó tôi không thể nhìn thấy vì kích thước phông chữ của tôi nhỏ? được sản phẩm nào có bất kỳ lạ "vô hình" chars?
Dan Rayson

60

Tôi sử dụng StringUtils.EMPTY, để ẩn nghĩa đen và cũng để thể hiện điều đó return StringUtils.EMPTYhoà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ĩ EMPTYlà biểu cảm hơn.


37
Theo những người khác đã đề xuất điều này: bạn cũng sử dụng ZERO cho 0 và ONE cho 1?
Jon Skeet

9
Tôi sẽ không so sánh trường hợp đặc biệt 'trống rỗng' với việc sử dụng chữ số nguyên.
Christopher Klewes

16
Tôi thấy StringUtils.EMPTY ít biểu cảm hơn "".
bacar

1
@JonSkeet Rất tôn trọng bạn. Tôi cảm thấy như bạn không chính xác ở đây. Mặc dù bạn và tôi có thể không bao giờ gặp phải điều này, nhưng có một trường hợp được thực hiện để không sử dụng chữ "" vì nó không cung cấp khả năng kiểm tra cú pháp nếu một nhà phát triển làm sai nó. Và vâng, tôi đã thấy các nhà phát triển cấp dưới làm rối tung những thứ đơn giản như "". Tôi không cố ý thay đổi EMPTY thành một thứ gì đó khác ngoài "". Tôi thích ý tưởng EMPTY chỉ vì trình biên dịch có thể hiểu được ý nghĩa của nó.
Andrew T Finnell,

@AndrewTFinnell: "Không chính xác" là một thuật ngữ kỳ quặc để chỉ những gì chắc chắn phải mang tính chủ quan. Không, tôi không mong đợi EMPTY sẽ thay đổi ý nghĩa, nhưng tôi - thích bacar - thấy ""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.
Jon Skeet

29

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 StringUtilsthay 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ó.


6
"Nếu có một tảng đá trên vỉa hè, bạn không cần phải ném nó." Kể điều đó với đứa con trai 6 tuổi của tôi.
roel

14

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ể.


4
Tôi tò mò - bạn đã bao giờ thấy điều này xảy ra trong mã chưa? Nếu vậy, đó là tình cờ hay cố ý? Việc vô tình làm có vẻ khó, và nếu có chủ đích, tôi cũng có thể dễ dàng tạo lớp StringUtils của riêng mình với hằng số EMPTY không trống và tham chiếu đến nó.
Ian Robertson

5
@IanRobertson Vâng, tôi đã thấy điều này xảy ra. Thực ra khá thường xuyên. Mọi người luôn cắt và dán từ các trang web và từ Bộ mã này sang Bộ mã khác. Cũng có những công ty vẫn sử dụng Clear Case sử dụng bộ mã cổ, sau đó được dịch một cách mù quáng sang bộ ISO cửa sổ và sau đó được dịch thành UTF-8 nếu bạn chuyển sang Git. Tôi đã dành vô số giờ để sửa chữa các vấn đề về bộ mã. Kể cả cái này.
Andrew T Finnell,

3
@AndrewTFinnell Tôi chắc chắn có thể thấy nói chung, điều đó có thể gây ra sự cố như thế nào. Nhưng bạn có thường xuyên nhìn thấy cụ thể một hằng số Chuỗi trống rỗng không?
Ian Robertson,

13

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 Stringthực tập và khởi tạo Lớp học:

  • Tất cả Stringcác chữ trong các nguồn Java được thực tập nội trú, làm cho bất kỳ ""StringUtils.EMPTYcác giống đối tượng
  • Việc sử dụng StringUtils.EMPTY có thể khởi tạo StringUtilslớ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, 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ỗiKhởi tạo lớp , tham khảo JLS 12.4.1 .


“Chỉ khi nó không được khai báo là cuối cùng”, vì vậy vì trường này được khai báo là cuối cùng, việc truy cập vào nó không thể gây ra việc khởi tạo StringUtilslớp.
Holger

@Holger đó là một tuyên bố chung nhưng thực sự, tôi đã chỉnh sửa với một liên kết đến javadoc cho thấy nó là cuối cùng (và do đó sẽ không khởi tạo lớp).
Matthieu

8

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).


13
Bạn đã bao giờ quan sát thấy điều này thực sự là một vấn đề (sử dụng "" một cách vô tình mà bạn muốn nói đến "")? Cá nhân tôi thấy chữ dễ đọc hơn và nó không bao giờ gây ra cho tôi bất kỳ vấn đề nào.
Jon Skeet

2
@ Jon Không, thực sự, nhưng tôi đã cố gắng để tìm thấy một lợi thế của việc sử dụng nó;)
Romain Linsolas

1
Không có quy tắc thời gian bình đẳng. Nếu không có lợi thế thì không có lợi thế.
Erick Robertson

1
Tôi cũng không thích "", 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.
賈 可 Jacky

2
TÔI NGHĨ 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 ).
賈 可 Jacky

5

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ó.


Ý tôi là nó có thể chấp nhận được vì tác giả đã chọn đi theo hướng này (tránh mọi việc sử dụng "giá trị ma thuật"). Nó phải là riêng tư mặc dù.
cherouvim

Tác giả sử dụng 0 thường xuyên trong mã. Sẽ tốt hơn cho họ khi xác định một hằng số int ZERO = 0? Nếu không, sự khác biệt là gì?
Jon Skeet

6
Nó phụ thuộc vào ngữ cảnh. Nếu đây là FCKEditorStringUtils, EMPTY của họ sẽ là "<p> & nbsp </p>" và tôi muốn thấy EMPTY được sử dụng lại thay vì sao chép giá trị kỳ diệu này ở khắp mọi nơi trong lớp. Vì vậy, theo EMPTY, họ có thể có nghĩa là EMPTY_CONTENT chứ không phải EMPTY_STRING (vì vậy ví dụ ZERO của bạn hơi bất công). Bạn sẽ không sử dụng lại hằng số ERROR_VISA_INVALID = 0 chứ?
cherouvim

1

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(..)


2
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.
cherouvim

và bạn sẽ cắm trại nullnhư thế nào? như đối số thứ 2 của equals, nhưng kết quả sẽ giống nhau -false
Bozho

isNotEmptylà trái ngược với "".equals(…), do đó, thực tế là nó sẽ đối xử nullnhư chuỗi rỗng 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ề truekhi và chỉ khi nó là một chuỗi rỗng và ném một NullPointerExceptionnếu chuỗi là null...
Holger

1

Tôi thấy StringUtils.EMPTYhữu ích trong một số trường hợp để dễ đọc. Đặc biệt với:

  1. Toán tử bậc ba, ví dụ.

    item.getId() != null ? item.getId() : StringUtils.EMPTY;
    
  2. Trả về Chuỗi trống từ một phương thức, để xác nhận rằng có, tôi thực sự muốn làm điều đó.

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.EMPTYtránh phải kiểm tra String pool?


4
Đối số của bạn với nhiều lần tra cứu không có giá trị. Trong chương 13.4.9 của Đặc tả ngôn ngữ Java 3.0, có đề cập rằng StringUtils.EMPTYhằng số được giải quyết tại thời điểm biên dịch.
Roland Illig

4
Tồn tại trong hồ bơi chuỗi được kiểm tra tại thời gian biên dịch và thời gian lớp xếp hàng, không trong thời gian chạy thời gian bao giờ y bạn thực hiện một tuyên bố như vậy,
Marquis của Lorne

1
StringUtil.EMPTYlà 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.
Holger

1

Không, vì tôi còn nhiều thứ để viết. Và một Chuỗi trốngrỗ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 " ";


7
Tôi khá không hiểu tại sao hầu hết các lập trình viên rất sợ viết "quá nhiều". Bằng cách viết StringUtils.EMPTY, bạn sẽ đạt được mã tự nhận xét, một mã dễ đọc hơn. Và theo Steve McConnell (hoặc một số nghiên cứu mà ông đã trích dẫn trong Code Complete 2.0), mã được đọc nhiều hơn gấp 7 lần so với được viết.
Paweł Dyda

1
Bạn nói đúng, NHƯNG: "" .equals (someString) dễ đọc như StringUtils.EMPTY.equals (someString)
Christian Kuetbach

StringUtils.EMPTY.equals (someString) sẽ dẫn đến lỗi Cú pháp nếu bạn viết sai. "" .equals (someString) sẽ không. Đây là lý do duy nhất người ta cần sử dụng EMPTY.
Andrew T Finnell,

1
@AndrewTFinnell đó là lý do tại sao các lập trình viên lành mạnh viết someString.isEmpty()thay thế.
Holger

-2

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:

  • Nó nổi bật hơn "".
  • Nó giải thích rằng bạn có nghĩa là trống, và khoảng trống đó có thể sẽ không.
  • Nó sẽ vẫn yêu cầu thay đổi ở mọi nơi nếu bạn không xác định biến của riêng mình và sử dụng nó ở nhiều nơi.
  • Nếu bạn không cho phép các ký tự chuỗi tự do trong mã thì điều này sẽ hữu ích.

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?
Pita

@Pita Xin lỗi, cách diễn đạt kém. Tôi muốn nói rằng nếu bạn sử dụng nội dòng này thay vì "" bạn vẫn không nhận được những lợi ích tương tự như việc xác định hằng số của riêng bạn và sử dụng lại ở nhiều nơi. Nó không phải là một đối số cho StringUtils.EMPTY, đó là một lời giải thích mà bạn không nhận được nhiều ngay cả khi nó 'có lý'. Cá nhân tôi sẽ tạo một hằng số với tên mô tả và sau đó gán tên này. Tôi đã thấy một vài trường hợp trong đó một nhà phát triển dự định một không gian duy nhất và kết thúc bằng một chuỗi trống, điều này không xảy ra với biểu mẫu này.
Oron
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.