سؤال

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

public static void DoStuff()
{
    String msg = "";
    if (GetMessage(msg))
    {
       System.out.println(msg);
    }
}
هل كانت مفيدة؟

المحلول

استخدم لjava.lang.StringBuilder - في الأساس سلسلة قابلة للتغيير. ومع ذلك، فإنه سيكون أكثر أمنا وأكثر "على غرار جافا" للعودة إلى سلسلة تعديلها.

نصائح أخرى

وأقترح بشدة أن لا تستخدم ب StringBuilder، حامل أو ما شابه ذلك. فهي الخارقة. تريد أن تعمل مع سلاسل، وليس بناة.

والنهج الأكثر وضوحا هو للعودة كائن يحتوي على البيانات التي ترغب في العودة. يغطي داود [bombe.livejournal.com ل] حل، لذلك لن أكرر ذلك. ومع ذلك، أود أن أقترح بدلا من محاولة لجعله الكرة عامة من البيانات، وجعلها محددة. جعله مثل كائن، وربما حتى أنها يمكن أن تنمو السلوك الحقيقي. (وإذا كنت حقا تريد أن تذهب إلى المدينة، إخفاء منشئ واعطائها طريقة إنشاء ثابت بدلا من ذلك.)

والنهج الثاني، غير معتمد على ما يرام في جاوة، هو عكس المكالمات. بدلا من العودة نتيجة لذلك، ونقول الاستدعاء النتيجة.

وو(أكثر أهمية) رمز الاستخدام سيكون شيء من هذا القبيل (يبدو غريبا بعض الشيء لأنها ليست محددة، ولا هو عام):

String userMessage = thing.doStuff(new StuffHandler<String>() {
    public String stuff(boolean success, String message) {
        return message+" was "+(success ? "succesful" : "unsuccesful");
    }
});

وتنفيذ غني عن شيء مثل:

public interface StuffHandler<T> {
    T stuff(boolean success, String message);
}

[...]

    public <T> T doStuff(StuffHandler<T> handler) {
        handler.stuff(isSuccess(), getMessage());
    }

وثمة نهج ثالث هو ببساطة لكسر الأسلوب في اثنين. قد تكون أو لا يكون ممكنا.

أولا أنا ربما لن يكون هذه المتطلبات. أنا متأكد من أنها يمكن عمل حولها. إذا كنت لا تريد أن تفعل ذلك، أنصح عودته كائن حاوية لمدة نتائجك:

public class ResultContainer {
    private final boolean success;
    private final String result;
    public ResultContainer(boolean success, String result) {
        this.success = success;
        this.result = result;
    }
    public boolean isSuccess() { return success; }
    public String getResult() { return result; }
}

وفي التعليمات البرمجية الرئيسي الخاص بك:

ResultContainer resultContainer = GetMessage(message);
if (resultContainer.isSuccess()) {
    System.out.println(resultContainer.getResult());
}

وGetMessage() ومن الواضح أن إنشاء مثيل جديد من ResultContainer وإعادته مليئة القيم العودة.

و(عن طريق الوراثة لResultContaineris اليسار باعتبارها ممارسة للقارئ.)

ويمكن إعادة استخدامها فئة حامل أكثر أناقة لأي نوع من الكائنات عن طريق استخدام الأدوية:

public class Holder<T> {
  T item;
  public Holder( T item) { set( item);}
  public T get( ) { return item;}
  public void set( T item) { this.item = item;}
}

وسوف DoStuff( ) ثم تبدو:

public static void DoStuff( ) {
  String msg = "";
  Holder<String> holder = new Holder<String>( msg);
  if ( getMessage( holder)) { System.out.println( holder.get( ));}
}

ووGetMessage( ) سيكون لاستدعاء holder.set( a_string).

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

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

<اقتباس فقرة>   

وأنا مقيدة للعودة منطقية فقط. لا يمكن طرح الاستثناءات.

هل لي أن أقترح عليك أن تستخدم فورتران أو C بدلا من جافا؟ وغالبا ما يكون اللغات الإجرائية المصطلح من طفرة وإعادة العلم، والتي هي مناسبة تماما لهذا النموذج (في حالة عدم وجود إدارة الذاكرة التلقائي، والمتصل يخلق ويمر في منطقة عازلة وهو بالسكان، وهذا يسمح المخزن المؤقت لتحريرهم بسلام عندما يتم المتصل معها؛ جافا لا تحتاج للقيام بذلك، لذلك إذا نظرتم الى القول Map.get () تقوم بإرجاع سلسلة أو لاغية اذا فشلت - لا حاجة لإدارة الذاكرة في المستدعي). على الأقل، لا يكلف نفسه عناء محاولة للعثور على طريقة مقبولة للقيام بذلك في جاوة اصطلاحي - مع هذه القيود، فإنه لن يكون، ولمن هو إجبارهم على أنك جعلت خيارا سيئا، مما يعني أنك إما أن يكون الخارقة ، أو في نهاية المطاف مع رمز مطول تحاول أن تجعل حل غير hacky.

ولا يمكنك استخدام سلسلة كمعلمة الانتاج. ان طريقة للقيام بذلك هو استخدام فئة ب StringBuilder بدلا من ذلك أو العودة لاغية لعدم.

مناقشة هنا

وسلاسل هي ثابتة، لذلك نعم، سوف تحتاج إلى التفاف سلسلة في StringHolder. يمكنك إرسال بنفسك ببساطة ك

  class StringHolder
  {
     String msg;
  }

  StringHolder sMsg = new StringHolder();
  sMsg.msg = "";
  if (GetMessage(sMsg))
  {
     System.out.println(sMsg.msg);
  }

وA StringHolder تافهة سيكون سلسلة [1].


bool GetMessage(String[] output)
{
     if(output.length < 1)
          throw new Exception("Output must be a String[1]");
     output[0] = "You win!";
}

public static void DoStuff()
{
      String[] msg = new String[1];
      if(GetMessage(msg))
      {
          System.out.println(msg[0]);
      }
}

وب StringBuilder هو على الأرجح الطريقة الكنسي للقيام بذلك، وإن كان.

وهذا هو بعض شرط غريب.

لماذا لا تفعل ذلك بالطريقة الصحيحة (أو على الأقل أسلوب جافا)؟ هو مثل محاولة للحصول على نتيجتين من وظيفة. مثل طرحها (2، 2) إرجاع 0 و "صباح الخير يا سيدي".

وحسنا على أي حال، يمكنك أن تجرب هذين الخيارين.

1. ب StringBuilder ليس أفضل شيء للاستخدام، منذ كنت لا "بناء" على سلسلة.

public static void doStuff(){
    String msg = "";
    StringBuilder sb = new StringBuilder();
    if ( getMessage( sb ) ) {
        System.out.println( sb );
    }
}

public static boolean getMessage( StringBuilder sb ) {
    if ( "".equals( sb.toString() )) {
        sb.delete( 0, sb.length() );
        sb.append("It was empty");
        return true;
    } else {
        return false;
    }
}

2 <م> StringHolder (حامل أي شيء في هذا الشأن) ليس جافا جدا أسلوب إما لكن للقيام بهذا العمل. وستكون هذه واحدة يستخدمها معظم مطور جافا وأنا أعلم.

public static void doStuff(){
    String msg = "";
    String [] holder = { msg };
    if ( getMessage( holder ) ){
        System.out.println( holder[0]  );
    }
}
public static boolean getMessage( String [] holder ) {
    if ( "".equals(  holder[0] )) {
        holder[0] = "It was empty";
        return true;
    } else {
        return false;
    }
}

3. اختيار. ليس ما طلبتم ولكن ما أود القيام به. ينتهك أسف "العودة منطقية" حالة.

public void doStuff() { 
    String msg = "";
    String result = getMessage( msg );
    if ( result != msg ) {
        System.out.println( result );
    }
}
public static String getMessage( String msg ) {
    if ( "".equals(msg){
        return "It was empty";
    }
    return msg
}

واختيار واحد.

ملاحظة

وعلى الرغم من أن ليس كل من يحب هذا (سيكون جون السكيت يقول "أليس المقبولة عالميا")، يرجى إلقاء نظرة على أسلوب الترميز جافا أنا باستخدام (طرق تبدأ مع انخفاض القضية والأقواس في نفس الخط). أحيانا يكون من المهم احترام منصة كنت الترميز في. على الأقل هذا ما أقوم به عندما كنت رمز في C # (نادرا جدا راجع للشغل)

و public boolean doStuff(String msg) { boolean boolTest = false; msg += "Appending something to msg"; int msgLength = msg.length(); if ( msgLength > 80 ) { boolTest = true; return boolTest; } return boolTest; }

هل هذا النوع من ما كنت تبحث عنه؟ أفترض اختبار منطقي وشيء من هذا القبيل اختبار إذا كانت الرسالة المتغيرة طويلة جدا لعرض (أكبر من 80 طول) أو شيئا من هذا القبيل، والتي لا تحتاج إلى استدعاء طريقة أخرى لتغيير سلسلة رسالة داخل doStuff ().

ويمكن أن يكون تماما قبالة قاعدة هنا، وإن كان. : -)

أولا ش إرسال تيه البرامج وجعلها من التعليمات البرمجية مثل هذا:

Process p = Runtime.exec("java GetMessage.class " + String);

ونصيحة لك: ينبغي أن تستخدم Runtime.exec في كل مكان. ثم يمكنك جعل العديد من البرامج.

وبعد ذلك ش الانتظار للعودة رمز حالة من هذا القبيل:

if (p.returnCode() = 1) 
  Out.printWord("1 made back"):
else 
  {
  Out.printWord("B Made back");
  }

وبهذه الطريقة ش يمكن استخدام برنامج آخر مثل من جانب هذا البرنامج. انه لامر جيد لجعل resusable التعليمات البرمجية. أعتبر من لي، لقد كنت في ذلك لسنوات. هذه هي الطريقة التي تجعل الايجابيات التعليمات البرمجية.

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