Cách tốt nhất để xác định hằng số trong android, lớp tĩnh, giao diện hoặc tài nguyên xml?


98

Tôi đang phát triển một ứng dụng Android sử dụng dịch vụ web để lấy dữ liệu từ máy chủ, vì tôi đang có ba bộ URL khác nhau để hệ thống phát triển điểm, máy chủ thử nghiệm và máy chủ trực tiếp. Thật khó để thay đổi URL bất cứ khi nào tôi muốn cung cấp ứng dụng để thử nghiệm / hoạt động. vì vậy tôi đã lên kế hoạch làm cho nó có thể cấu hình được, để ứng dụng đó có thể nhận được URL thích hợp dựa trên hằng số cấu hình loại xây dựng của tôi. Vì thế,

  • đâu là cách tốt nhất để giữ hằng số này, lớp tĩnh java hoặc giao diện công cộng java hoặc tệp tài nguyên xml.? Khi nào? Tại sao?
  • cái nào mang lại hiệu suất tốt hơn ?, khi nào? Tại sao?

Ví dụ: tài nguyên xml

<integer name="config_build_type">0</integer>
<string-array name="url_authentication">
    <item >http://development.com/xxxx</item>
    <item >http://test.com/xxx</item>
    <item >http://example.com/xxx</item>
</string-array>

Hằng số tĩnh trong Java

public class Config {
    public static final int BUILD_TYPE = 0; // 0 - development, 1 - test, 2 - live
    public static final String[] URL_AUTHENTICATION = {"http://development.com/", "http://test.com/", "http://example.com"};
}

1
Tôi rất nghi ngờ hiệu suất sẽ là một vấn đề ở đây ...
Alex Lockwood

Liệu các cuộc gọi Dịch vụ Web là trong một lớp hay nhiều lớp?
Venky

@venky, rằng trong nhiều lớp, mỗi mục đích khác nhau tức là một cho xác thực người dùng khác để dữ liệu tải về và như vậy ..
Jayabal

Câu trả lời:


92

Có một sự khác biệt lớn giữa cả hai ở chỗ bạn có thể tham khảo các tài nguyên dự án trong bố cục XML của mình. Chúng có sẵn trong ngữ cảnh ứng dụng và do đó có thể truy cập được trên ứng dụng toàn cầu. Ưu điểm lớn nhất của việc sử dụng tài nguyên dự án là dễ truy cập và chúng cho phép bạn tổ chức dự án của mình một cách đáng kể.

static finalhằng số được biên dịch thành bytecode java; tài nguyên dự án được biên dịch thành định dạng nhị phân trong apk. Truy cập vào một trong hai là cực kỳ hiệu quả ... nếu có sự khác biệt giữa hai, nó là rất nhỏ.

Không có một quy tắc thiết lập nào về cách bạn nên sử dụng tài nguyên / hằng số trong dự án của mình. Điều đó nói rằng, cá nhân tôi sử dụng tài nguyên cho các giá trị mà tôi có thể cần sử dụng trong mã XML hoặc java của mình. Mặt khác, tôi thường sử dụng static finalhằng số cho các giá trị sẽ chỉ được sử dụng bởi mã java của tôi và dành riêng cho việc triển khai của tôi.

Cũng lưu ý rằng có thể tải tài nguyên XML trong thời gian chạy tùy thuộc vào cấu hình hiện tại của thiết bị (tức là kích thước màn hình, ngôn ngữ, v.v.). Vì vậy, bạn nên cân nhắc điều này khi quyết định có nên khai báo hằng số trong XML hay trực tiếp trong các .javatệp của bạn hay không .


các nguồn lực được dễ dàng hơn rất nhiều để cấu hình trong hương vị khác nhau / xây dựng các loại
HopefullyHelpful

@Alex Tôi có một chút nghi ngờ, bạn có thể vui lòng giải thích: Chúng tôi khuyên bạn nên sử dụng các biến tĩnh ít hơn để nếu chúng tôi tạo tệp hằng số với biến tĩnh thì nó sẽ không ảnh hưởng đến hiệu suất của ứng dụng của chúng tôi?
Pallavi

2
Một điểm bổ sung cần xem xét là, nếu một hằng số cuối cùng được sử dụng trên nhiều lớp, thì tất cả các đối tượng đó sẽ cần phải được biên dịch lại nếu hằng số bị thay đổi. Nhưng đó không phải là trường hợp nếu hằng được lưu trữ dưới dạng tài nguyên. Đây có thể là một cân nhắc quan trọng cho một dự án lớn cần nhiều thời gian để biên dịch.
orodbhen

23

Đối với những người muốn xem cách chúng ta có thể sử dụng một Lớp để xác định các hằng số của chúng ta và gọi bất kỳ nơi nào chúng ta cần.

Constant.java

    package org.nrum.nrum;

/**
 * Created by rajdhami on 5/23/2017.
 */
public class Constant {
    public static final String SERVER = "http://192.168.0.100/bs.dev/nrum";
//    public static final String SERVER = "http://192.168.100.2/bs.dev/nrum";
    public static final String API_END = SERVER + "/dataProvider";
    public static final String NEWS_API = API_END + "/newsApi";
    public static final String BANNER_API = API_END + "/bannerApi/lists";
    public static final String NOTICE_API = API_END + "/noticeApi/lists";
    public static final String UPLOAD_PATH = SERVER + "/uploads";
    public static final String UPLOAD_PATH_BANNER = UPLOAD_PATH + "/company_1/banner";
    public static final String UPLOAD_PATH_NEWS = UPLOAD_PATH + "/company_1/news";
    public static final int BANNER_TRANSITION_DURATION = 5000;
    public static final int NOTICE_BUTTON_BLINK_DURATION = 5000;
    public static final int BANNER_FETCH_LIMIT = 3;
}

Bây giờ chúng ta có thể sử dụng các hằng số trên theo cách sau.

Constant.NOTICE_BUTTON_BLINK_DURATION

1
Câu hỏi đã được hỏi cho cách tốt nhất !!
shadygoneinsane

@Umar Tôi muốn sử dụng khác nhau vai trò khác nhau khác nhau URL khác nhau, xin vui lòng giúp đỡ ,, trước khi mà tôi đã sử dụng tương tự như urs
Kuldeep Singh

11

Trong trường hợp chung:

  • Các giá trị XML có lợi thế về Accessbilty trong tệp bố cục và tệp kê khai so với Hằng số trong tệp java
  • Giá trị XML có lợi thế cho việc hỗ trợ đa ngôn ngữ so với Hằng số trong tệp java

1
cảm ơn u Dheeresh, ya tôi hiểu, nó là rất hữu ích để giữ cấu hình trong xml được truy cập bởi cả hai bố trí, biểu hiện và java
Jayabal

2

Luôn luôn là một phương pháp hay để trích xuất các chuỗi giao diện người dùng từ mã ứng dụng của bạn và giữ chúng trong một tệp bên ngoài. Android làm cho việc này trở nên dễ dàng với thư mục tài nguyên trong mỗi dự án Android.

http://developer.android.com/training/basics/supporting-devices/languages.html


Câu hỏi là về các hằng số chỉ được sử dụng trong nội bộ mã Java. Đó là một kịch bản khác. Đối với trường hợp cụ thể của các thẻ văn bản thuộc giao diện người dùng, như bạn đề cập, chắc chắn rằng vị trí phù hợp là các tài nguyên XML của dự án Android.
cesargastonec

2

Tôi nghĩ rằng cả hai cách có vẻ tốt nhưng điều đó là nó phụ thuộc vào yêu cầu của bạn.

Nếu bạn có các giá trị của mình (liên kết dịch vụ web) trong XML và giả sử có bất kỳ thay đổi nào trong các giá trị của bạn (liên kết dịch vụ web), bạn có thể dễ dàng thay đổi chỉ trong tệp XML.

Nhưng nếu bạn sử dụng các lớp bên trong làm biến tĩnh, bạn phải thay đổi trong tất cả các tệp lớp.

Vì vậy, đề xuất của tôi là tách các hằng số khỏi tệp nguồn và đưa vào tài nguyên và truy cập nó ..


1
"bạn có thể dễ dàng thay đổi chỉ trong tệp XML" Nó dễ dàng như thay đổi nó trong tệp Java, và trong cả hai trường hợp, bạn sẽ cần phải xây dựng lại dự án, vì vậy tôi không nghĩ đó là sự khác biệt, hãy bỏ qua một lợi thế.
Fran Marzoa

0

Tôi rất vui vì ai đó đã hỏi điều này ... cộng một!

Tài nguyên dự án cần quyền truy cập vào Ngữ cảnh, không có sẵn trong các phương thức tĩnh (trừ khi bạn chuyển nó vào, v.v.), nhưng luôn có sẵn trong Hoạt động - dường như có một kết nối ưu tiên giữa tài nguyên và bố cục. Đối với các biến và hằng ứng dụng có thể được xử lý trong các phương thức tĩnh, tôi tạo một lớp trừu tượng và thực hiện nhập tĩnh (của lớp hằng số này) trong tất cả các tệp lớp dự án khác.

PVS

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.