لماذا تعد String هي الفئة الوحيدة التي توجد لها قيم حرفية في Java؟

StackOverflow https://stackoverflow.com/questions/1404887

  •  05-07-2019
  •  | 
  •  

سؤال

لماذا java.lang.String الطبقة الوحيدة التي يوجد لها طريقتان للخلق:

1) بالطريقة العادية مع "new"الكلمة الرئيسية.

String s = new String("abc");

2) مع String الحرفي (والذي يتوفر فقط مع String فصل)

String s = "abc";

فلماذا هناك String حرفية ولا حرفية لأي فئات أخرى؟؟

هل كانت مفيدة؟

المحلول

وسلسلة، في حين يجري الطبقة العادية، ويمثل أحد العناصر الأساسية للبرمجة (الآخرون هم الأرقام والقيم المنطقية). لذلك، وقد نظرت جافا الأجسام سلسلة كمتغيرات شبه بدائية من يوم واحد، ويسمح هذا.

وفي وقت لاحق، عندما أصبحت لصناعة السيارات في الملاكمة جزء من المجمع القياسية، ويمكن أيضا بناء الأجسام المجمع رقمية في هذه الطريقة، أي بمعنى.

Integer i = 123;

وكما يذكر توم Hawtin-tackline في التعليقات على هذه المسألة.

نصائح أخرى

إجابة مختصرة، لأن مصممي اللغة شعروا بذلك.

أعتقد أن String هي فئة شائعة لدرجة أنها قدمت استثناءً.أنا متأكد من أن هناك بعض الاستثناءات الأخرى المشابهة أيضًا (انظر تعليق توم هوتينز)

وإذا نحينا جانبا autoboxing (التي لا تعول IMO - والحرفية هي لأنواع بدائية من الطبقات؛ هناك مجرد التحويل الضمني لفئة المجمع)، منشئ String(String) مفيد فعلا. ويأخذ نسخة من البيانات الشخصية، مما يعني أنه إذا كان <م> الأصلي سلسلة صغيرة ولكن مع char[] دعم كبير، وسلسلة جديدة مستقلة عن ذلك.

وهذا يمكن أن يكون مهما إذا كنت تقرأ خطوط قصيرة من ملف، على سبيل المثال.

وأما لماذا هناك سلسلة حرفية: لأنهم مفيد. ما الذي لديك بدلا من ذلك؟ هل ترغب في فرض مطورين لاستخدام:

String x = new String(new char[] { 'h', 'e', 'l', 'l', 'o' });

و في نفس الوقت لا تحصل على interning؟

وماذا فئة أخرى هل تريد حرفي عنه؟ لن يمكن القول الحرفية للخرائط وقوائم تكون مفيدة - لا أستطيع أن أتذكر سواء أكانت القادمة في جافا 7 أم لا. يمكنك التفكير في المهيآت مجموعة باسم "قليلا مثل حرفي" في أنه من اختزال للتهيئة الكائن.

أفترض أن السلسلة تعتبر نوعًا أساسيًا من البيانات التي يعتبرونها على نفس مستوى البيانات الأولية.

بالمناسبة،

new String("abc");

في الواقع يخلق سلسلتين:

  1. المعتقل الذي تفقد مرجعيته
  2. مثيل جديد بنفس المحتوى

أنا شخصياً لم أجد أبدًا حاجة لاستخدام مُنشئ String.

أنواع الكائنات التي تحتوي على حروف هي سلاسل, باطل و حرفية الطبقة.

من الممكن أيضًا استخدام أدوات التهيئة لـ صفائف ويمكن أيضًا استخدام القيم الحرفية البدائية لإنشاء كائنات إذا تم استخدامها كأدوات تهيئة، والتي تناسب "طريقتي الإنشاء" في بناء جملة بسيط دون أن تكون قيمًا حرفية حقيقية (يمكن استخدامها فقط لتهيئة قيمة وليس في جميع الأماكن التي يستخدم فيها تعبير الكائن يمكن أن يحدث ).

إذا كنت تستخدم تقنيات أخرى مثل التسلسل والانعكاس، فيمكنك كسر "طريقتين للإبداع" أيضًا.

من المقرر أن يوفر Java 7 القدرة على المجموعات الأولية عبر القيم الحرفية التي تشبه إلى حد كبير المصفوفات الحرفية:

وراجعت الماضي:

Integer wInt = 1;

ويعمل على ما يرام.

والنموذج الأخير من الخلق ينطوي أيضا سلسلة interning. وهذا هو، إذا كان لديك رمز:

String s = "abc";
String t = "abc";

والمترجم وتحسين هذا وتحصل على اثنين من المراجع إلى كائن سلسلة نفسه. (والصورة == ر يكون صحيحا).

وسلسلة interning يعمل من أجل تعبيرات سلسلة للغاية.

وهناك، بطبيعة الحال، أيضا الحرفية لجميع أنواع رقمية بدائية، والقيم المنطقية صحيحة وكاذبة، وحرف. أفترض أنك يمكن الرد أن في سؤالك أنك قلت من الناحية الفنية "لا حرفية لأي أخرى <ط> الطبقات ". حسنا. أعتقد أن أشار أحدهم إلى أن "لاغية" هو كائن الحرفي، لذلك البيان غير دقيق من الناحية الفنية، ولكن أعتقد أن هذا هو المثال الوحيد الآخر.

ولكن بعد ذلك، السؤال الذي يطرح نفسه هو القادم، ما الطبقات البعض هل تريد أن يكون الحرفية عنه؟ إذا كنت تصمم اللغة، ما من شأنه نظرة الحرفي BufferedReader مثل؟ أو resultset والحرفي؟ أو JCheckBox؟

هل يمكن القول نظريا، على سبيل المثال، وهو "ملف الحرفي" هو اسم ملف المغلقة في بعض محدد خاص، مثل "$ / الوطن / بوب / على Myfile.txt $". ولكن بعد ذلك شخص يمكن أن يقول، وماذا عن JButton، لا يمكن أن نجعل حرفي لذلك مثل مع نص زر وActionListener انها تطلق والمحددات المناسبة، مثل "٪ إرسال، SubmitListener٪". ثم ماذا عن مآخذ، لا يمكن أن نضع اسم المضيف في بعض محدد خاص، وما إلى ذلك وأعتقد أنه من الواضح تماما أننا تشغيل بسرعة للخروج من علامات الترقيم لاستخدام كمحددات. لذلك كنا في نهاية المطاف الحاجة إلى كتابة نوعا من النص لتحديد الفئة التي نتحدث عنها، مثل قوله الملف ( "/ الوطن / بوب / على Myfile.txt") أو المقبس ( "www.example.com"، 631 ). ولكن هذا يبدو ضخم مثل منشئ، وسنكون الحق في العودة إلى ما واضعي جافا فعل في الواقع.

وعدد من "الأشياء" التي يمكن التعبير عنها بمحض طبيعة القيمة (على سبيل المثال كافة الأرقام تجعل رقمية حرفية) أو مع علامات الترقيم محدودة جدا من قبل عدد من علامات الترقيم التي يمكن أن يكون لائقا ريونابلي على لوحة المفاتيح. وأنت تريد لوحة مفاتيح مع 600 الرموز الخاصة لجميع نوع مختلف من الأشياء التي قد ترغب في التحدث عنه؟ الكلمات هي أسهل بكثير وأكثر مرونة.

وهكذا تستخدم سلسلة شيوعا، وكان يمكن أن يكون البدائل حرج جدا، وأنه من المنطقي أن تجعل من حالة خاصة.

وسلسلة حرفية هي اختصار مناسب مع أسبقية راسخة (في C) وبناء الجملة. إذا أراد المصممين جافا لجذب المبرمجين C ++ أكثر، كانت سلسلة حرفية أن يكون هناك. لحسن الحظ معالجة السلسلة الكثير تعقلا في جاوة مما كانت عليه في C ++.

كان

ولا الأجسام القياسية الأخرى بحكم الواقع جملة - كيف تكتب خريطة الحرفي؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top