2013-07-23 28 views
6

Hãy để tôi đầu tiên khởi động của với một mẫu mã ...Java - Kiểu mã hóa: Khuyết điểm và ưu điểm của so sánh chuỗi kiểu "ABC" ("SOMESTRING") là gì?

String password = ""; 

if("PIRATE".equals(password)) { 
    // Do something 
} 

Xem ở đây, các Chuỗi không đổi hoặc đen (bất kỳ) "Pirate" được sử dụng để kiểm tra sự bình đẳng giữa hai Strings. Trong khi đó ...

String password = ""; 
if(password.equals("PIRATE")) { 
    // Do something 
} 

điều này cũng hoạt động chính xác như mã trước đó.

Hiện tại, tôi thấy rất nhiều kiểu đầu tiên "STRING_LITERAL" .equals (STRING_OBJECT), trong khi người Java đăng mã.

Vì vậy, câu hỏi của tôi là, Kiểu này đến từ đâu?Có tốt hơn kiểu thứ hai theo bất kỳ cách nào không?

Thực tế tôi tìm thấy kiểu thứ hai hợp lý hơn so với kiểu đầu tiên, tại sao?!

cho phép hãy yêu cầu như thế nào, nếu người dùng cung cấp mật khẩu bằng với "Pirate", sau đó cung cấp cho phép người dùng

khi bạn bắt đầu thực hiện các yêu cầu trên,

String userProvidedPassword = getPaswordFromUser(); 

if(userProvidedPassword.equals("PIRATE")) { 
// Allow him 
} 

Điều này không hợp lý hơn "PIRATE" .equals (userProvidedPassword);?! Chỉ cần suy nghĩ về nó ...

Đúng tôi nếu tôi sai .. Cảm ơn ..


EDIT: Xin lỗi, this question đã không đến trong tìm kiếm trước đây của tôi, và nó trả lời câu hỏi của tôi hoàn hảo. Cũng nhờ tất cả những người đã giúp đỡ ở đây ..

+0

Bạn tránh kiểm tra không rõ ràng. Điều này làm cho mã ngắn gọn hơn. –

+1

Với điều này: 'userProvidedPassword.equals (" PIRATE ")' bạn cần một kiểm tra null bổ sung: 'userProvidedPassword! = Null && userProvidedPassword.equals (" PIRATE ")' – NINCOMPOOP

Trả lời

8

Khi bạn viết password.equals("PIRATE") bạn đang gần như yêu cầu cho một NullPointerException, nơi có những cơ hội cho password sức null.

Đó là tất cả về Tránh NullPointerException.

if("PIRATE".equals(password)) { 
    // Do something 
} 

Tránh NullPointerException

nơi như

if(password.equals("PIRATE")) { 
    // Do something 
} 

thrwos bạn NullPointerException nếu passwordnull.

Tuy nhiên, Cá nhân tôi cảm thấy điều này có vẻ lạ ở giữa mã. và tôi luôn thích viết

if(password !=null && password.equals("PIRATE")){ 

//do something 

} 
+1

Câu trả lời hay, công việc tốt. –

+1

nhờ suresh .. giải thích .. – Dreamer

+0

@Dreamer Rất vui, tôi có thể giúp bạn :) –

16

"PIRATE".equals(password) không thể dẫn đến NullPointerException.

trong khi

password.equals("PIRATE") sẽ ném một NullPointerException nếu password sẽ xảy ra là null.

Vì vậy, việc sử dụng tên cũ được khuyến khích: nó an toàn hơn.

+0

Câu trả lời hay, tôi chưa bao giờ nhận ra điều này trước đây. Hindsight là 20/20, có vẻ hiển nhiên ngay bây giờ! –

+0

tuyệt vời .. cảm ơn .. tôi cũng không nghĩ theo cách đó .. bằng cách nào những gì có thể được thực hiện về vấn đề ** hardcoding ** trong khi sử dụng phong cách này? – Dreamer

+1

Sử dụng hằng số thay vì Chuỗi được mã hóa cứng – bowmore

3

Con duy nhất thực sự là vấn đề về phong cách. Nói "PIRATE" .equals (password) được gọi là Yoda Condition. Tuy nhiên, như mọi người đã nói, nó là an toàn hơn để sử dụng loại điều kiện (vì vậy tôi sẽ tiếp tục sử dụng loại đó).

+1

+1 Để đề cập đến điều kiện Yoda! – NINCOMPOOP

Các vấn đề liên quan