Java
Giai đoạn. Ngừng hẳn. Kết thúc câu chuyện.
Bắt đầu từ đâu? Ồ, tôi biết bắt đầu từ đâu: Java cực kỳ phức tạp, xấu xí và ngu ngốc và vốn đã bị phá vỡ . Tôi cần nói nhiều hơn? :( Được rồi, sau đó: gõ xóa .
Sau đó, có quản lý tài nguyên không xác định. Kewl footcher!
Điều gì tiếp theo? Oh yeah: regexes ngu ngốc của Java là thịt bò khó chịu nhất của tôi. Tôi không thể đếm được bao nhiêu lần tôi đã bị hos vì không có đủ dấu gạch chéo ngược. Điều này thậm chí còn tồi tệ hơn việc không có quyền truy cập vào bất kỳ thuộc tính Unicode nào trong thiên niên kỷ này - đó là con bò hoàn chỉnh. Mười năm hết hạn !!! Hoàn toàn vô dụng. Đồ bỏ đi.
Sau đó, có lỗi mà các phím tắt lớp nhân vật không hoạt động trên phi ASCII. Thật là một nỗi đau hoàng gia! Và thậm chí không cân nhắc sử dụng \p{javaWhiteSpace}
; nó không làm đúng với một số điểm mã khoảng trắng Unicode rất phổ biến.
Bạn có biết có một \p{javaJavaIdentifierStart}
tài sản? Họ đang nghĩ gì vậy? Rất vui vì họ đã nhận được những cái nhìn thông minh như vậy trên wurkin.
Bạn đã bao giờ thử sử dụng cờ CANON_EQ chưa? Bạn có biết điều đó thực sự xảy ra, và những gì nó không làm? Làm thế nào về cái gọi là trường hợp Unicode Unicode Một loạt các vỏ bọc bình thường hoàn toàn không hoạt động.
Sau đó, họ làm cho nó khó khăn để viết regexes duy trì. Java vẫn chưa tìm ra cách viết các chuỗi nhiều dòng, vì vậy cuối cùng bạn sẽ viết những thứ điên rồ như thế này:
"(?= ^ [A-Z] [A-Za-z0-9\\-] + $) \n"
+ "(?! ^ .* \n"
+ " (?: ^ \\d+ $ \n"
+ " | ^ [A-Z] - [A-Z] $ \n"
+ " | Invitrogen \n"
+ " | Clontech \n"
+ " | L-L-X-X \n"
+ " | Sarstedt \n"
+ " | Roche \n"
+ " | Beckman \n"
+ " | Bayer \n"
+ " ) # end alternatives \n"
+ ") # end negated lookahead \n"
Tất cả những dòng mới là gì? Ồ, chỉ là sự ngu ngốc của Java. Họ đã sử dụng các bình luận Perl, không phải các bình luận Java ( những kẻ ngốc! ) Đi đến cuối dòng. Vì vậy, nếu bạn không đặt chúng \n
ở đó, bạn hãy cắt bỏ phần còn lại của mẫu. Duh và đôi duh!
Đừng sử dụng regexes trong Java: cuối cùng bạn sẽ muốn phá vỡ mọi thứ, tất cả đều rất đau đớn và tan vỡ. Tôi không thể tin mọi người đưa ra điều này. Một số thì không .
Sau đó, chúng ta có thể bắt đầu nói về những điều vớ vẩn của Java với các bảng mã. Đầu tiên, có một thực tế là mã hóa nền tảng mặc định luôn là mã hóa 8 bit khập khiễng mặc dù các ký tự của Java là Unicode. Sau đó, làm thế nào họ không đưa ra một ngoại lệ về lỗi mã hóa. Bạn được đảm bảo để có được tào lao. Hoặc làm thế nào về điều này:
OutputStreamWriter(OutputStream out)
Creates an OutputStreamWriter that uses the default character encoding.
OutputStreamWriter(OutputStream out, Charset cs)
Creates an OutputStreamWriter that uses the given charset.
OutputStreamWriter(OutputStream out, CharsetEncoder enc)
Creates an OutputStreamWriter that uses the given charset encoder.
OutputStreamWriter(OutputStream out, String charsetName)
Creates an OutputStreamWriter that uses the named charset.
Có gì khác biệt? Bạn có biết rằng chỉ một trong số đó sẽ đưa ra một ngoại lệ nếu bạn có lỗi mã hóa? Phần còn lại chỉ mõm họ.
Sau đó, sự ngu ngốc của các ký tự Java không đủ để chứa một ký tự! họ đang nghĩ cái quái gì vậy? Đó là lý do tại sao tôi gọi chúng là charchars. Bạn phải viết mã như thế này nếu bạn mong đợi nó hoạt động đúng:
private static void say_physical(String s) {
System.out.print("U+");
for (int i = 0; i < s.length(); i++) {
System.out.printf("%X", s.codePointAt(i));
if (s.codePointAt(i) > Character.MAX_VALUE) { i++; } // UG!
if (i+1 < s.length()) { System.out.printf("."); }
}
}
Và ai đã từng nghĩ sẽ làm điều đó? Không có ai bên cạnh.
Có bao nhiêu nhân vật trong đó "\uD83D\uDCA9"
? Một hoặc hai? Phụ thuộc vào cách bạn đếm chúng. Công cụ regex tất nhiên xử lý các ký tự logic, do đó một mẫu ^.$
sẽ thành công và một mẫu ^..$
sẽ thất bại. Sự điên rồ này được thể hiện ở đây:
String { U+61, "\u0061", "a" } =~ /^.$/ => matched.
String { U+61, "\u0061", "a" } =~ /^..$/ => failed.
String { U+61.61, "\u0061\u0061", "aa" } =~ /^.$/ => failed.
String { U+61.61, "\u0061\u0061", "aa" } =~ /^..$/ => matched.
String { U+DF, "\u00DF", "ß" } =~ /^.$/ => matched.
String { U+DF, "\u00DF", "ß" } =~ /^..$/ => failed.
String { U+DF.DF, "\u00DF\u00DF", "ßß" } =~ /^.$/ => failed.
String { U+DF.DF, "\u00DF\u00DF", "ßß" } =~ /^..$/ => matched.
String { U+3C3, "\u03C3", "σ" } =~ /^.$/ => matched.
String { U+3C3, "\u03C3", "σ" } =~ /^..$/ => failed.
String { U+3C3.3C3, "\u03C3\u03C3", "σσ" } =~ /^.$/ => failed.
String { U+3C3.3C3, "\u03C3\u03C3", "σσ" } =~ /^..$/ => matched.
String { U+1F4A9, "\uD83D\uDCA9", "💩" } =~ /^.$/ => matched.
String { U+1F4A9, "\uD83D\uDCA9", "💩" } =~ /^..$/ => failed.
String { U+1F4A9.1F4A9, "\uD83D\uDCA9\uD83D\uDCA9", "💩💩" } =~ /^.$/ => failed.
String { U+1F4A9.1F4A9, "\uD83D\uDCA9\uD83D\uDCA9", "💩💩" } =~ /^..$/ => matched.
Sự ngu ngốc đó là tất cả bởi vì bạn không thể viết hoàn toàn hợp lý \u1F4A9
, và dĩ nhiên bạn không nhận được bất kỳ cảnh báo nào rằng bạn không thể làm điều đó. Nó chỉ làm điều sai trái.
Ngốc nghếch.
Trong khi chúng ta đang ở đó, toàn bộ \uXXXX
ký hiệu bị chết não bẩm sinh. Bộ tiền xử lý Java ( vâng, bạn đã nghe tôi nói ) trước khi Java thực hiện, do đó bạn bị cấm viết những thứ hoàn toàn hợp lý như thế "\u0022"
, bởi vì vào thời điểm Java thấy rằng, bộ tiền xử lý của nó đã biến nó thành """
, do đó bạn mất. Oh chờ đã, không phải nếu nó trong một regex! Vì vậy, bạn có thể sử dụng "\\u0022"
tốt.
Riiiiiii!
Bạn có biết Java không có cách nào để thực hiện isatty(0)
cuộc gọi không? Bạn thậm chí không được phép nghĩ những suy nghĩ như vậy. Nó sẽ không tốt cho bạn.
Và sau đó là sự ghê tởm cả lớp.
Hoặc thực tế là không có cách nào để chỉ định mã hóa tệp nguồn Java của bạn trong cùng một tệp nguồn đó để bạn không bị mất nó? Một lần nữa tôi yêu cầu được biết: CÁI GÌ ĐÃ NGHINK
Dừng cơn điên! Tôi không thể tin rằng mọi người bỏ rác này. Đó là một trò đùa hoàn chỉnh. Tôi thà là một người chào đón Walmart còn hơn chịu đựng những cú đá và mũi tên của sự điên rồ thái quá của Java. Tất cả đều hỏng, và họ không chỉ không thể sửa nó, họ sẽ không sửa nó.
Điều này bởi cùng một người foxy-grapey tự hào về một ngôn ngữ làm cho nó bất hợp pháp để có một printf()
chức năng. Trời ạ, chắc chắn là nó hoạt động rất tốt, mặc dù vậy!?
Tê giác tuyệt vời. Bitch-tát là quá tử tế với họ. Nếu tôi muốn lập trình trong trình biên dịch chương trình, tôi sẽ. Đây không phải là một ngôn ngữ có thể cứu được. Hoàng đế không có quần áo.
Chúng tôi ghét nó. Chúng tôi ghét nó mãi mãi . Hãy để nó chết chết !