Là tốt hơn để sử dụng chuỗi hoặc int để tham chiếu enums bên ngoài phần java của hệ thống?


10

Chúng tôi đã có một cuộc thảo luận tại nơi làm việc của tôi về việc sử dụng enum trong Java.

Một đồng nghiệp đã lập luận rằng khi sử dụng enum ở phía máy chủ, bất cứ khi nào chúng ta cần sử dụng chuỗi để tham chiếu đến nó (ví dụ như khi gửi dữ liệu từ JS đến máy chủ hoặc khi lưu trữ trong cơ sở dữ liệu), lập luận rằng điều này rõ ràng hơn nhiều cho nhà phát triển và cũng lập luận rằng nó sẽ thất bại nhanh trong trường hợp lỗi chính tả.

Tôi luôn sử dụng số nguyên để xác định enum trong các trường hợp này, vì đó sẽ là số nhận dạng bất biến và sẽ không gặp vấn đề về trường hợp và lỗi đánh máy (ngay cả khi một nhà phát triển đã mắc lỗi sử dụng giá trị 2 thay vì 1, nó sẽ không bị lỗi nhanh).

Rất phân tích về những lập luận này, tôi sẽ nói rằng sử dụng chuỗi tốt hơn, nhưng tôi có cảm giác lạ về nó (như thể đó không phải là một cách tiếp cận tốt).

Có thực hành tốt nhất về cuộc thảo luận này có thể hướng dẫn tôi không?

Chỉnh sửa: Bất cứ khi nào có thể, chúng tôi sử dụng chính enum, vì vậy tất cả mã Java của chúng tôi đều sử dụng Enum. Ý tôi là "tham chiếu đến một enum": tham chiếu giá trị trong enum khi trao đổi dữ liệu từ JavaScript đến máy chủ hoặc lưu trữ dữ liệu trong cơ sở dữ liệu


1
Một "tham chiếu đến một enum" cho bạn là gì? Sử dụng bình thường trong mã nguồn? Tuần tự hóa để lưu trữ trong một cơ sở dữ liệu? Biểu hiện để sử dụng trong tài liệu người dùng? Biểu hiện để sử dụng trong tài liệu kỹ thuật? Câu trả lời sẽ khá khác nhau cho tất cả những người đó.
Kilian Foth

Tôi đã chỉnh sửa câu hỏi và tôi hy vọng nó là rõ ràng hơn bây giờ: bởi "tham chiếu đến một enum" Ý tôi là tham khảo giá trị khi trao đổi dữ liệu từ hoạt Javascript để Server hoặc cách khác xung quanh hoặc lưu trữ một giá trị trong cơ sở dữ liệu
JSBach

Trong API javascript tôi chắc chắn sử dụng chuỗi. Trong DB cả hai đều có lợi thế của họ. Một số cơ sở dữ liệu đã được xây dựng trong hỗ trợ enum.
CodeInChaos

Câu trả lời:


15

Câu hỏi hay. Việc sử dụng enum trong Java chủ yếu nhằm xử lý thông tin có phần phân loại trong tự nhiên. Ví dụ kinh điển là sử dụng enum để xử lý bốn loại bộ đồ mà thẻ có thể có. Nó cung cấp tất cả lợi thế về hiệu suất của việc sử dụng một số nguyên và nó cũng rõ ràng trong chương trình của bạn.

Vậy ngoài Java, tại sao bạn không tiếp tục sử dụng một số nguyên? Có lẽ bạn không có loại enum bên ngoài Java, mặc dù điều đó không có nghĩa là bạn không thể tiếp tục sử dụng số nguyên cho mục đích hiệu suất, phải không? Vâng, điều đó hoàn toàn đúng, mặc dù hãy xem xét những gì xảy ra khi bạn thêm một giá trị enum mới. Nếu bạn không thêm nó vào cuối, tất cả các giá trị enum khác sau giá trị mới sẽ được tăng thêm một. Vâng, chúng tôi sẽ chỉ định số để nó không thể thay đổi hoặc chúng tôi sẽ luôn thêm nó vào cuối. Bạn có tự tin rằng đồng nghiệp của bạn sẽ luôn luôn làm đúng bởi điều đó? Hả? Có lẽ? Hy vọng? Có lẽ bạn không 100% về điều đó. Hãy ghi nhớ điều đó trong một giây.

Sếp của bạn nói với bạn rằng có một mớ hỗn độn tại máy khách sử dụng phần mềm của bạn sau lần cập nhật cuối cùng. Bây giờ tất cả các thực thể X hoạt động giống như chúng được gán giá trị enum Y ngay cả khi chúng thực sự được gán Z. Bạn kiểm tra kho lưu trữ và có, ai đó đã thêm một giá trị enum mới và không tuân theo hướng dẫn của bạn khi bạn yêu cầu chúng. Bây giờ bạn có thêm một sự phức tạp rằng trên cơ sở dữ liệu nó được viết 4, khi nó thực sự là 3, không bao gồm các bản ghi đã được chèn trước khi cập nhật thực sự 4. Giá trị enum nào liên quan đến 4? Có phải là Y không? Bạn không thể nhớ. Bạn cần kiểm tra chương trình để xác minh. Nói một cách đơn giản, đó là một mớ hỗn độn.

Thay vào đó, cơ sở dữ liệu của bạn đã viết "HEARTS", "DIAMONDS", "SPADES", "CLUBS", bạn đã mất rất ít về không gian và thu được rất nhiều. Đúng là chúng ta đang nói về một hiệu suất nhỏ, nhưng bạn thực sự không nên truy cập vào cơ sở dữ liệu thường xuyên để tạo sự khác biệt. Đối với không gian, hãy để điều đó cho quản trị viên hệ thống (không phải vấn đề của bạn.).

Nếu bạn đã thực hiện một chương trình đơn giản, dễ thực hiện thay đổi, thì về lâu dài, bạn đã tự mình làm điều đó, hãy tin tôi. Khía cạnh này của nó không khác gì trong quan điểm khiêm tốn của tôi.


2
Điểm hay, nhưng bạn đang quên về trường hợp ai đó quyết định thay đổi tên của một trong những thực thể enum ( HEARTSthành Hearthoặc một cái gì đó trong ví dụ của bạn) và đột nhiên mọi thứ lại phá vỡ.
Scott Whitlock

1
@ScottWhitlock Không phải nếu bạn tính đến điều đó, mặc dù họ có thể quyết định đổi tên hoàn toàn. Họ có thể vô tình xóa cơ sở dữ liệu và xóa dự án, nhưng chúng tôi không thể tính đến mọi sự cố có thể xảy ra ở đây.
Neil

5
@Neil - đúng nhưng chúng tôi đang cố gắng chơi tỷ lệ cược ở đây. Tôi không quen thuộc với các enum Java, nhưng trong C #, tôi đặt rõ ràng các giá trị cho enum nếu các giá trị cần có ý nghĩa bên ngoài chương trình (chẳng hạn như trong cơ sở dữ liệu) (ví dụ: Hearts = 1, Diamonds = 2, v.v.) . Vì đó không phải là cách mặc định để sử dụng enum, nên nó sẽ tạm dừng trình chỉnh sửa sau. Cộng với một nhận xét lưu ý nơi khác được sử dụng là tiện dụng.
Scott Whitlock

1
@ScottWhitlock Đó chắc chắn là cách tốt hơn để tìm hiểu về nó để tránh những vấn đề như vậy. Mặc dù giả sử bạn đã làm điều đó, bạn vẫn thấy 1, 2, 3, 4 trên cơ sở dữ liệu hoặc được tuần tự hóa trong một số tệp. Không lý tưởng từ quan điểm bảo trì bất kỳ cách nào bạn cắt nó.
Neil

2
Nếu tôi có thể thêm, nếu enum được tuần tự hóa dưới dạng chuỗi và ai đó thay đổi tên của enum, trong quá trình khử lưu huỳnh, lỗi sẽ xảy ra trong quá trình phân tích cú pháp. Nếu enum là int và ai đó thay đổi định nghĩa, lỗi sẽ tiếp tục xuống dòng, trong quá trình xử lý, sẽ khó chẩn đoán hơn. CC @ScottWhitlock.
Endy Tjahjono

1

Tôi đồng ý với câu trả lời của Neil, nhưng chỉ là một bổ sung:

Trong java enums là các đối tượng, vì vậy chúng có thể có các trường và phương thức. Vì vậy, bạn có thể cung cấp cho mỗi enum một số giá trị được chỉ định thủ công và khi tham chiếu nó cho công việc bên ngoài, thay vào đó hãy sử dụng giá trị đó.

Nó sẽ tồn tại cả việc thêm / xóa / sắp xếp lại và thay đổi tên của thể hiện enum. Nhưng bạn sẽ phải viết logic tuần tự hóa / giải tuần tự hóa cho các trường enum thay vì sử dụng tự động có sẵn trong nhiều công cụ. (Nó dễ dàng, nhưng công việc quảng cáo của nó).

Và bạn phải giữ các giá trị đó theo cách thủ công (nhưng đó là giống nhau trong enum kiểu C) và bạn có thể viết kiểm tra để kiểm tra điều đó.


Có, chúng tôi đã đi theo con đường này, nhưng chúng tôi đang sử dụng hibernate và chúng tôi đã phải thêm một số mã bổ sung để có thể phân tích giá trị đến / từ cơ sở dữ liệu và nó có vẻ lạ, vì vậy chúng tôi đã quyết định sử dụng mối quan hệ .STRING và đi với tên enum.
JSBach
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.