سؤال

هل هناك أي طريقة صعبة لاستخدام الكلمات المحجوزة Java كمتغير أو طريقة أو فئة أو واجهة أو حزمة أو تعداد أسماء ثابتة؟

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

المحلول

لا، لا توجد طريقة. لهذا السبب تم تصنيفهم "محفوظة".

نصائح أخرى

هذا هو سؤال وجيه. شيء من هذا القبيل هو ممكن بلغات أخرى. في C#، بادئة المعرف مع @ (كما طلب من قبل) ؛ في دلفي ، بادئة مع &. لكن Java لا تقدم أي ميزة من هذا القبيل (جزئيًا لأنها لا تحتاج حقًا إلى التفاعل مع المعرفات المحددة من قبل اللغات الأخرى بالطريقة التي يعمل بها .NET World).

غالبًا ما تظهر هذه المشكلة لـ "Class" ، وفي هذه الحالة من المعتاد كتابة "Clazz".

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

ولكن حيث توجد إرادة ، هناك طريقة. انسخ الكود التالي في IDE الخاص بك ، قم بتبديل الملف المصدر الذي يشفر إلى UTF-16 وهنا نذهب:

public class HelloWorld {

    public static void main(String[] args) {

        HelloWorld.nеw();
    }

    public static void nеw () {
        System.out.println("Hello,World");
    }

}

هذا الرمز هو فئة Java جيدة الشكل وصالحة. ومع ذلك ، نظرًا لأنك خمنت أن هناك خدعة صغيرة: لا تنتمي الشخصية "الجديدة" في المعرف "الجديد" إلى مجموعة أحرف ASCII ، فهي في الواقع عبارة عن "е" (ye "المفعم بالحيوية (ye").

تسمح مواصفات لغة Java الحالية صراحة ، وهذه نقطة مهمة لجعلها ، استخدام Unicode لتسمية المعرفات. هذا يعني أن المرء لديه القدرة على الاتصال بها بحرية أو فصوله باللغة الفرنسية أو شينيس أو الروسية إذا رغبوا في ذلك. من الممكن أيضًا خلط ومواكبة الحروف الهجائية داخل الكود. وتاريخيا ، بعض الرسائل داخل الحروف اللاتينية وغيرها من الحروف الحرارية هي لوكال.

نتيجة لذلك: لا ، لا يمكنك استخدام الكلمات المحجوزة كمعرفات ، ولكن يمكنك استخدام المعرفات التي تبدو تمامًا مثل الكلمات المحجوزة.

ما إذا كان يجب على أي شخص أن يفعل ذلك أمر مختلف تمامًا.

لا ، لا يمكنك فعل هذا. لمزيد من المعلومات ، يرجى الذهاب إلى أقسام JLS 3.8 ، 3.9

يتم حجز تسلسل الأحرف التالية ، التي تم تشكيلها من أحرف ASCII ، للاستخدام ككلمات رئيسية ولا يمكن استخدامها كمعرفات (§3.8):

Keyword: one of
        abstract    continue    for           new          switch
        assert      default     if            package      synchronized
        boolean     do          goto          private      this
        break       double      implements    protected    throw
        byte        else        import        public       throws
        case        enum        instanceof    return       transient
        catch       extends     int           short        try
        char        final       interface     static       void 
        class       finally     long          strictfp     volatile
        const       float       native        super        while

نعم هنالك. عليك استخدام كلمات محفوظة من المستقبل. مثل ما حدث بطرق مختلفة تسمى Assert () في رمز ما قبل 1.4.

أتمنى أن يساعد!

هاه؟ لماذا تريد أن تفعل ذلك؟ يمكنك كتابتها في L33T ، والتي سوف تخدع المترجم.

class cl4ss {
  String r3turn() {
    return "but why?";
  }
}

أعلم أنه لا يزال سؤالًا قديمًا ، قد يساعد شخصًا ما.

من الممكن استخدام GSON's دعم تسمية الميدان

على سبيل المثال.

@SerializedName("new")
private String New;
public String getNew ()
{
    return New;
}
public void setNew (String aNew)
{
    New = aNew;
}

إنه أمر سيء بما فيه الكفاية أن بعض اللغات الحساسة للحالة تسمح بأشياء مثل ما يلي:

class New;

class Something
{
    New makeNew()
    {
      return new New();
    }
}

ولكن لماذا تريد أن تكون قادرًا على كتابة سطر من الكود مثل هذا:

class new;

class Something
{
    bool if;

    new makeNew()
    {
        return if ? new new() : null;
    }
}

فقط نلقي نظرة على تمييز بناء الجملة. حتى يتم الخلط!

لا توجد طريقة لاستخدام كلمات محفوظة مع جافاك المترجم.

من الناحية الفنية ، يمكنك قم بتحرير الأسماء داخل ملف الفصل بمجرد تجميعه لكي تكون أي شيء تريده: في تلك المرحلة ، لا يهتم VM ، لأنه لم يعد يتعامل مع كود المصدر بعد الآن. أعتقد أن بعض المحتالين يستخدمون هذه التقنية.

PL/1 (لغة برمجة IBM Mainframe في عام 1960 لا تزال موجودة اليوم) مطلوبة إلى حد ما أنه على الرغم من أن بعض الكلمات تتصرف مثل الكلمات الرئيسية في سياقات معينة ، يمكن استخدام جميع الكلمات كمعرفات. هذا ليس من الصعب القيام به في محلل إذا شرعت في ذلك. تم اعتبار PL/1 في Langauge كبيرة إلى حد ما ، وقلق لجنة Langauge من أن العديد من المبرمجين لن يتعلموا كل ذلك ، ومن ثم سوف ينفد عندما حاولوا استخدام الكلمة الرئيسية من جزء لم يعرفوه كمعرف . لذلك يمكنك كتابة أشياء مثل:

IF BEGIN=ELSE THEN CALL=3 ELSE CALL FOO(ENDIF) ENDIF

كما لاحظ الآخرون هنا ، فإن القدرة على القيام بذلك ليست توصية.

قرر مصممو Java عدد الكلمات الرئيسية في Langauge متواضعة ، وحفظ المجموعة. حتى أنهم يحتفظون بـ "Goto" ، والذي لا يُسمح به بالفعل في أي برنامج Java حقيقي.

لست متأكدًا مما تحاول القيام به ، ولكن $ هو شخصية صالحة في المعرفات ، حتى تتمكن من القيام بذلك ، قل:

int $return = 5;

يبدو غريباً بعض الشيء ، لكنه يعمل.

في Scala يمكنك استخدام backticks. على سبيل المثال: myvarialbe.`class "

إذا كنت بحاجة حقًا إلى استخدام حقل/متغير محلي/طريقة تسمى نفس الكلمة المحجوزة ، أقترح إلحاق السطح السفلي في نهاية الاسم:

// JPA entity mapping class:

private Boolean void_;

public Boolean getVoid_() { ... }
void setVoid_(Boolean void_) { ... }

إنه خيار أكثر قابلية للقراءة (IMHO) من إلحاق الشوائب في بداية الاسم (fvoid ، تجنب ، vvoid ، إلخ)

الكود أعلاه هو حالة العالم الحقيقي التي حدثت لي ، تعمل مع قاعدة بيانات قديمة ، حيث invoice يحتوي الجدول على حقل اسمه void تشير إلى ما إذا كانت الوثيقة قد ألغيت أم لا.

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