Khi so sánh một biến chuỗi với một chuỗi ký tự bằng chữ .equals (), có một cách thực hành chuẩn cho thứ tự của các mục không? [đóng cửa]


11

Có những lợi ích cho mỗi và tôi hiểu sự khác biệt, nhưng những gì được coi là tốt nhất / thực hành tiêu chuẩn? Và tại sao?

Ví dụ :

"myString".equals(myStringVar)
  • Tránh một NPE tiềm năng và không yêu cầu kiểm tra null. (Điều tốt?)
  • Sạch hơn để đọc vì không cần kiểm tra null.
  • Nếu null không phải là một giá trị mong đợi, chương trình của bạn có thể bị phá vỡ mà không phải là bất kỳ khôn ngoan hơn.

Tuy nhiên

myStringVar.equals("myString")
  • Yêu cầu kiểm tra null nếu null là giá trị mong đợi. (Điều tốt?)
  • Có thể làm lộn xộn các điều kiện ghép với kiểm tra null.
  • Cho phép NPE cho chúng tôi biết nếu có gì đó bị hỏng.

Biến thể nào được coi là tiêu chuẩn để sử dụng cho Java và tại sao?


2
Có hay không null là một giá trị mong đợi, liệu hoạt động "bằng" có phải là nơi để xác định rằng đây là vấn đề không?
Matthew Flynn

Tôi không nghĩ rằng nó là. Nhưng đó là ý kiến ​​của tôi. Tôi muốn nghe lý do của người khác.
BrandonV

Trong các ngôn ngữ sử dụng = và / hoặc == cho các bài tập / so sánh, thông thường tốt nhất là đặt thứ không thể thay đổi ở bên trái để bạn không thể thực hiện một bài tập ngẫu nhiên khi bạn muốn so sánh. Đối với các ngôn ngữ sử dụng các phương thức trên một đối tượng như .equals tôi không nghĩ nó quan trọng.
GordonM 18/03/2016

Câu trả lời:


3

Tôi nghi ngờ rằng điều này bắt nguồn từ một biện pháp phòng ngừa an toàn được sử dụng khi lập trình trong C (hoặc C ++) cũ hơn. Trong C, bạn có thể vô tình gán giá trị khi bạn muốn kiểm tra đẳng thức:

if (x = 3)

Điều kiện này sẽ luôn đúng, vì nó gán giá trị xa là 3, không kiểm tra x bằng 3. Để tránh lỗi tinh vi này, các nhà phát triển bắt đầu đảo ngược điều kiện:

if (3 = x)

Cái này chứa cùng một "lỗi", nhưng sẽ tạo ra lỗi trình biên dịch, vì vậy nó an toàn hơn.

Các ngôn ngữ hiện đại hơn không gặp phải vấn đề này và chúng có thể dễ dàng cảnh báo bạn khi bạn cố gắng thực hiện những điều này. Như vậy, nó không có nhiều ưu tiên thuần túy, vì vậy hãy chọn một và sử dụng nó một cách nhất quán.


-1 Đây không phải là lý do cho quy ước Java cho equals. Không giống như trong C, vấn đề đối với Java là biểu thức x.equals(y)sẽ ném NPE khi xnull. Nếu bạn có một chuỗi ký tự "something"và bạn muốn coi trường hợp này nulllà "không bằng", sẽ rất hợp lý "something".equals(y)nếu bạn không biết liệu ycó thể là null hay không. Điều này sẽ không bao giờ ném NPE.
Andres F.

1
  • Tiêu chuẩn và thực hành tốt sẽ thay đổi theo văn hóa của một tổ chức bạn đang làm việc cho

  • Tiêu chuẩn của chúng tôi trong .NET myStringVar == "myString"đơn giản là vì chúng tôi đã đồng ý về nó, tức là chúng tôi tin rằng nó sạch sẽ và hợp lý

Lưu ý: Điều này không áp dụng cho Java do ==so sánh các tham chiếu thay vì chính các đối tượng. Trong Java bạn nên sử dụng myStringVar.equals("myString").


3
Ít nhất là trong Java, không sử dụng ==vì nó chỉ so sánh các tham chiếu đối tượng. Điều đó nói rằng, +1 cho tập hợp - quy ước thường định nghĩa cách làm "đúng".
Michael K

Cám ơn bạn vì đã chỉ ra điều này! Tôi đã cập nhật câu trả lời :)
CodeART

@CodeWorks: Tôi nghĩ bạn đã bỏ lỡ quan điểm của Michael. Ngoài ra, đó là Java không phải JAVA.
amara

Câu hỏi là: "nhưng điều gì được coi là tốt nhất / tiêu chuẩn thực hành? Tại sao?" Câu trả lời của tôi là tiêu chuẩn và thực hành tốt nhất thay đổi từ tổ chức này sang tổ chức khác. Bạn có không đồng ý với điều đó không?
CodeART

@CodeWorks: Không ai có thể không đồng ý với điều đó, CodeWorks. Nhưng mọi người đều có thể đồng ý rằng đó myStringVar == "myString"là một ý tưởng cực kỳ tồi tệ trên Java (trừ khi bạn hoàn toàn chắc chắn myStringVarđược thực tập).
amara

0

Tôi nghĩ rằng bạn đúng ở chỗ nó phụ thuộc vào ngữ nghĩa vô hiệu của biến. Nếu bạn không mong đợi nó là null và không phải kiểm tra và xử lý thì mẫu đầu tiên sẽ sạch hơn.

Điều đó nói rằng, thay vì nhúng chuỗi ký tự, một lựa chọn tốt hơn có thể là:

private final String MY_STRING = "myString";
if(MY_STRING).equals(myStringVar);

Đặc biệt là nếu có tiềm năng sử dụng chuỗi ở nhiều nơi hơn một.


2
-1: không thực sự tốt hơn; thêm lộn xộn với giá trị thường không đáng kể
amara

@sparkleshy - Không đồng ý, bạn thực sự không muốn chuỗi ký tự được rắc thông qua logic mã của bạn. Như đã đề cập trong câu trả lời ban đầu, nếu chuỗi ký tự được sử dụng ở nhiều nơi hơn thì tôi chắc chắn sẽ nói để cấu trúc lại chúng.
Benjamin Wootton

Để nói rằng, bạn phải triệt để triệt tiêu python, vì trong python, định danh về cơ bản là chuỗi ký tự. Và tôi nghĩ tất cả chúng ta phải đồng ý rằng trăn là một ngôn ngữ tốt.
amara
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.