วิธีใดเป็นวิธีที่ดีที่สุดในการกำหนดค่าคงที่ใน Android ทั้งคลาสแบบคงที่ส่วนต่อประสานหรือทรัพยากร xml


101

ฉันกำลังพัฒนาแอปพลิเคชัน Android ที่ใช้บริการเว็บเพื่อรับข้อมูลจากเซิร์ฟเวอร์เนื่องจากฉันมี URL สามชุดที่แตกต่างกันเพื่อชี้ระบบการพัฒนาเซิร์ฟเวอร์ทดสอบและเซิร์ฟเวอร์ที่ใช้งานจริง การเปลี่ยน URL เป็นเรื่องยากเมื่อใดก็ตามที่ฉันต้องการให้แอปพลิเคชันทดสอบ / ใช้งานจริง ดังนั้นฉันจึงวางแผนที่จะทำให้มันสามารถกำหนดค่าได้เพื่อให้แอปพลิเคชันได้รับ URL ที่เหมาะสมตามค่าคงที่การกำหนดค่าประเภทการสร้างของฉัน ดังนั้น,

  • วิธีใดเป็นวิธีที่ดีที่สุดในการเก็บค่าคงที่คลาส java static หรือ java public interface หรือไฟล์ทรัพยากร xml เมื่อไหร่? ทำไม?
  • ซึ่งให้ประสิทธิภาพที่ดีกว่า? เมื่อไร? ทำไม?

เช่นทรัพยากร 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>

ค่าคงที่คงที่ของ 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
ฉันสงสัยอย่างมากว่าประสิทธิภาพจะเป็นปัญหาที่นี่ ...
Alex Lockwood

การเรียกใช้บริการเว็บอยู่ในคลาสเดียวหรือหลายคลาส?
Venky

@venky ซึ่งในหลายคลาสแต่ละคลาสมีจุดประสงค์ที่แตกต่างกันเช่นหนึ่งสำหรับการตรวจสอบผู้ใช้อีกอันหนึ่งเพื่อดาวน์โหลดข้อมูลและอื่น ๆ ..
Jayabal

คำตอบ:


93

มีความแตกต่างอย่างมากระหว่างสองสิ่งนี้ที่คุณสามารถอ้างอิงทรัพยากรโครงการในเค้าโครง XML ของคุณ มีอยู่ในบริบทของแอปพลิเคชันดังนั้นจึงสามารถเข้าถึงได้จากแอปพลิเคชันส่วนกลาง ข้อดีที่สุดของการใช้ทรัพยากรโครงการคือความสะดวกในการเข้าถึงและช่วยให้คุณสามารถจัดระเบียบโครงการของคุณได้อย่างมีนัยสำคัญ

static finalค่าคงที่ถูกรวบรวมไว้ใน bytecode java; ทรัพยากรโครงการถูกรวบรวมเป็นรูปแบบไบนารีภายใน apk การเข้าถึงอย่างใดอย่างหนึ่งมีประสิทธิภาพมาก ... หากมีความแตกต่างระหว่างทั้งสองสิ่งนี้เป็นเรื่องเล็กน้อย

ไม่มีกฎที่กำหนดไว้ว่าคุณควรใช้ทรัพยากร / ค่าคงที่ในโครงการของคุณอย่างไร ที่กล่าวว่าฉันใช้ทรัพยากรเป็นการส่วนตัวเพื่อหาค่าที่ฉันอาจต้องใช้ใน XML หรือโค้ดจาวา บนมืออื่น ๆ ที่ผมมักจะใช้static finalค่าคงที่ค่าที่จะเพียง แต่นำมาใช้โดยรหัส Java ของฉันและมีความเฉพาะเจาะจงกับการดำเนินงานของฉัน

นอกจากนี้โปรดทราบว่าสามารถโหลดทรัพยากร XML ที่รันไทม์ได้ขึ้นอยู่กับการกำหนดค่าปัจจุบันของอุปกรณ์ (เช่นขนาดหน้าจอตำแหน่งที่ตั้ง ฯลฯ ) ดังนั้นคุณควรคำนึงถึงสิ่งนี้เมื่อตัดสินใจว่าคุณควรประกาศค่าคงที่ใน XML หรือไม่หรือใน.javaไฟล์ของคุณโดยตรง


ทรัพยากรนั้นง่ายกว่ามากในการกำหนดค่าในรสชาติ / ประเภทการสร้างที่แตกต่างกัน
หวังว่าจะเป็นประโยชน์ใน

@ อเล็กซ์ฉันมีข้อสงสัยอย่างใดอย่างหนึ่งโปรดช่วยให้กระจ่าง: ขอแนะนำให้ใช้ตัวแปรคงที่น้อยลงดังนั้นหากเราสร้างไฟล์คงที่ด้วยตัวแปรคงที่จะไม่ส่งผลต่อประสิทธิภาพของแอปพลิเคชันของเราหรือไม่?
Pallavi

2
ประเด็นเพิ่มเติมที่ต้องพิจารณาคือถ้าค่าคงที่สุดท้ายถูกใช้ในหลายคลาสวัตถุเหล่านั้นทั้งหมดจะต้องได้รับการคอมไพล์ใหม่หากค่าคงที่เปลี่ยนไป แต่นั่นไม่ใช่กรณีหากค่าคงที่ถูกเก็บไว้เป็นทรัพยากร นี่อาจเป็นการพิจารณาที่สำคัญสำหรับโครงการขนาดใหญ่ที่ต้องใช้เวลานานในการรวบรวม
orodbhen

24

สำหรับผู้ที่ต้องการดูว่าเราสามารถใช้ Class เพื่อกำหนดค่าคงที่ของเราและเรียกค่าใด ๆ ที่เราต้องการได้อย่างไร

ค่าคงที่ 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;
}

ตอนนี้เราสามารถใช้ค่าคงที่ข้างต้นได้ด้วยวิธีต่อไปนี้

Constant.NOTICE_BUTTON_BLINK_DURATION

1
ถามถูกถามทาง !!
Shadygoneinsane

@ Umar ฉันต้องการใช้บทบาทที่แตกต่างกัน URL ที่แตกต่างกันโปรดช่วยด้วย, ก่อนหน้านั้นฉันใช้เหมือนกันเช่น urs
Kuldeep Singh

11

ในกรณีทั่วไป:

  • ค่า XML มีข้อได้เปรียบในการเข้าถึงไฟล์เลย์เอาต์และไฟล์รายการเหนือค่าคงที่ในไฟล์ java
  • ค่า XML มีข้อดีสำหรับการรองรับหลายภาษาเหนือค่าคงที่ในไฟล์ java

1
ขอบคุณ Dheeresh คุณเข้าใจแล้วมันมีประโยชน์มากในการเก็บการกำหนดค่าใน xml ซึ่งเข้าถึงได้โดยทั้งเลย์เอาต์ manifest และ java
Jayabal

2

เป็นแนวทางปฏิบัติที่ดีเสมอในการแยกสตริง UI จากโค้ดแอปของคุณและเก็บไว้ในไฟล์ภายนอก Android ทำให้สิ่งนี้เป็นเรื่องง่ายด้วยไดเรกทอรีทรัพยากรในโครงการ Android แต่ละโครงการ

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


คำถามเกี่ยวกับค่าคงที่ที่จะใช้ภายในโดยโค้ด Java เท่านั้น มันเป็นสถานการณ์ที่แตกต่างกัน สำหรับกรณีเฉพาะของแท็กข้อความที่เป็นของอินเทอร์เฟซผู้ใช้ดังที่คุณกล่าวถึงไม่ต้องสงสัยเลยว่าสถานที่ที่เหมาะสมคือแหล่งข้อมูล XML ของโครงการ Android
cesargastonec

2

ฉันคิดว่าทั้งสองทางดูเหมือนจะดี แต่สิ่งที่ขึ้นอยู่กับความต้องการของคุณ

หากคุณมีค่าของคุณ (ลิงก์บริการเว็บ) ใน XML ของคุณและสมมติว่ามีการเปลี่ยนแปลงค่าของคุณ (ลิงก์บริการเว็บ) คุณสามารถเปลี่ยนเฉพาะในไฟล์ XML ได้อย่างง่ายดาย

แต่ถ้าคุณใช้ภายในคลาสเป็นตัวแปรคงที่คุณต้องเปลี่ยนไฟล์คลาสทั้งหมด

ดังนั้นข้อเสนอแนะของฉันคือการแยกค่าคงที่จากไฟล์ต้นฉบับและใส่ลงในทรัพยากรและเข้าถึงได้ ..


1
"คุณสามารถเปลี่ยนเฉพาะในไฟล์ XML" มันง่ายพอ ๆ กับการเปลี่ยนไฟล์ในไฟล์ Java และในทั้งสองกรณีคุณจะต้องสร้างโปรเจ็กต์ใหม่ดังนั้นฉันไม่คิดว่านั่นคือความแตกต่างปล่อยให้ข้อดี
Fran Marzoa

0

ฉันดีใจที่มีคนถามเรื่องนี้ ... บวกหนึ่ง!

ทรัพยากรของโปรเจ็กต์จำเป็นต้องเข้าถึงบริบทซึ่งไม่สามารถใช้ได้ในวิธีการแบบคงที่ (เว้นแต่คุณจะส่งผ่านเป็นต้น) แต่จะพร้อมใช้งานเสมอในกิจกรรม - ดูเหมือนว่าจะมีการเชื่อมต่อระหว่างทรัพยากรและเลย์เอาต์เป็นพิเศษ สำหรับตัวแปรและค่าคงที่ของแอปที่อาจประมวลผลในวิธีการคงที่ฉันสร้างคลาสนามธรรมและทำการอิมพอร์ตแบบคงที่ (ของคลาสค่าคงที่นี้) ในไฟล์คลาสโปรเจ็กต์อื่น ๆ ทั้งหมด

PVS

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.