জাভা “?” নাল পরীক্ষা করার জন্য অপারেটর - এটি কী? (টার্নারি নয়!)


88

আমি একটি স্ল্যাশডট গল্প থেকে লিঙ্কিত একটি নিবন্ধ পড়ছিলাম, এবং এই সামান্য জোয়ার জুড়ে এসেছি:

জাভার সর্বশেষতম সংস্করণটি নিন, যা অন্তহীন পয়েন্টার পরীক্ষার জন্য শর্টহ্যান্ড সিনট্যাক্স সরবরাহ করে নাল-পয়েন্টার চেক করা সহজ করার চেষ্টা করে। কেবলমাত্র প্রতিটি পদ্ধতির অনুরোধে একটি প্রশ্ন চিহ্ন যুক্ত হওয়ার সাথে স্বয়ংক্রিয়ভাবে নাল পয়েন্টারগুলির জন্য একটি পরীক্ষা অন্তর্ভুক্ত করা হয়, যদি ইঁদুরের নীড়ের পরিবর্তে যদি বিবৃতি হয় তবে:

    public String getPostcode(Person person) {
      String ans= null;
      if (person != null) {
        Name nm= person.getName();
        if (nm!= null) {
          ans= nm.getPostcode();
        }
      }
      return ans
    } 

এর সাথে:

public String getFirstName(Person person) {
      return person?.getName()?.getGivenName();
    } 

আমি ইন্টারনেটকে স্কল করেছি (ঠিক আছে, আমি "জাভা প্রশ্ন চিহ্ন" -তে কমপক্ষে 15 মিনিট গুগল করার বিভিন্নতা ব্যয় করেছি) এবং কিছুই পাইনি। সুতরাং, আমার প্রশ্ন: এটি সম্পর্কে কোনও অফিসিয়াল ডকুমেন্টেশন আছে? আমি দেখতে পেয়েছি যে সি # এর একই অপারেটর রয়েছে ("??" অপারেটর), তবে আমি যে ভাষায় কাজ করছি তার জন্য ডকুমেন্টেশন পেতে চাই Or আগে কখনো দেখিনি.

ধন্যবাদ!

সম্পাদনা: নিবন্ধটির লিঙ্ক: http://infoworld.com/d/developer-world/12-programming-mistkes-avoid-292


4
আমরা নিবন্ধের একটি লিঙ্ক অন্তত থাকতে পারে?
কার্ল নচেটেল

4
আর স্নিপেটের উত্স?
খচিক

4
নিবন্ধটি ভুল। infoworld.com/print/145292 আমি বিশ্বাস করি এটির জন্য একটি প্রকল্পের কয়েন জমা দেওয়া হয়েছিল। তবে এটি নির্বাচিত হয়নি (নিবন্ধে উল্লিখিত কারণে - আপনি যদি এই ধরণের কাজ করতে চান, সি # বা কিছু ব্যবহার করুন), এবং অবশ্যই জাভা ভাষার বর্তমান সংস্করণে নেই।
টম হাটিন -

4
এটি সি # এর সমান নয় ?? অপারেটর: ?? coalesces নাল, অর্থাত্ A ?? B == (A != null) ? A : B। বস্তুর রেফারেন্স নাল নয়, অর্থাত্ এটি কোনও সামগ্রীর কোনও সম্পত্তি মূল্যায়ন করার জন্য উপস্থিত হয় A?.B == (A != null) ? A.B : null
রুপ

4
@ আর্টি: @ নটনুল টীকাগুলির বিশাল ব্যবহারকারী হিসাবে, যা আমি লিখি কোডে মূলত সর্বত্রই রয়েছে, এনপিইগুলি কী কী তা আমি খুব ভালভাবে জানি না (এপিআইগুলি খারাপভাবে ব্যবহার করার সময় ব্যতীত)। তবুও আমি এই "শর্টকাট স্বরলিপি" বুদ্ধিমান এবং আকর্ষণীয় মনে করি। অবশ্যই নিবন্ধটি ঠিক আছে যখন এতে বলা হয়েছে: সর্বোপরি, এটি সমস্যার মূলটিকে সরিয়ে দেয় না: দ্রুত এবং looseিলে প্রোগ্রামিংয়ের কারণে নাল মানগুলির বিস্তার। 'নাল' ওওএ / ওওডি স্তরে বিদ্যমান নেই। এটি অন্য একটি জাভা-আইডিয়োসিনক্র্যাটিক বাজে কথা যা বেশিরভাগ ক্ষেত্রে কাজ করা যায়। আমার কাছে এটি সর্বত্র @ নটনুল
সিন্ট্যাক্সটি

উত্তর:


80

আসল ধারণাটি গ্রোভির কাছ থেকে আসে। এটি প্রকল্পের মুদ্রার অংশ হিসাবে জাভা 7 এর জন্য প্রস্তাবিত ছিল: https://wiki.openjdk.java.net/display/Coin/2009+ প্রপোজালস + টিওসি (এলভিস এবং অন্যান্য নাল-সেফ অপারেটর), তবে এখনও গৃহীত হয়নি ।

সম্পর্কিত এলভিস অপারেটর x ?: y?: এর জন্য শর্টহ্যান্ড তৈরি করার প্রস্তাব দেওয়া হয়েছিল x != null ? x : y, বিশেষত কার্যকর যখন এক্স একটি জটিল ভাব থাকে।


4
জাভাতে (যেখানে নালার জন্য কোনও স্ব-জবরদস্তি নেই) সংক্ষিপ্ত বিবরণx!=null ? x : y
মাইকেল বর্গওয়ার্ট

@ মিশেল বর্গওয়ার্ট: ভালো কথা, আমি গ্রোভি সিনটিক্সের কথা ভাবছিলাম।
ataylor

50
?এলভিস প্রিসলির স্বাক্ষর কুইফ; ন্যায়বিচার :যথারীতি একজোড়া চোখের প্রতিনিধিত্ব করে। সম্ভবত ?:-oআরও উস্কানিমূলক ...
আন্দ্রেজ ডয়েল

4
?:0একটি "নাল নয়, বা 0" অপারেটর হওয়া উচিত। তেমনই করে ফেলো.
Azz

4
এলভিস অপারেটর হিসাবে প্রস্তাবটি উল্লেখ করা আসলে ভুল ছিল। Mail.openjdk.java.net/pipermail/coin-dev/2009- জুলাই /002089.html "নুল-সেফ ডেরেফারেন্সিং " ব্যবহারের জন্য আরও ভাল শব্দ।
JustinKSU

63

এই সিনট্যাক্সটি জাভাতে বিদ্যমান নেই এবং এটি আমার জানা আগত সংস্করণগুলির মধ্যে অন্তর্ভুক্ত করা হবে না।


9
ডাউনটা কেন? আমি যতদূর জানি এই উত্তরটি 100% সঠিক ... আপনি যদি কিছু আলাদা জানেন তবে দয়া করে এটি বলুন।
কলিনড

6
@ ওয়েবিনেটর: এটি জাভা 7 বা 8 এ চলে না এবং এই মুহূর্তে অন্য কোনও "আসন্ন সংস্করণ" নেই। আমি এটি এটিকে এমনভাবে তৈরি করার সম্ভাবনাও কম বলে মনে করি যেহেতু এটি খারাপ অভ্যাসগুলিকে উত্সাহ দেয়। আমি "তবুও" প্রয়োজনীয় বলে মনে করি না, যেহেতু "জাভাতে অস্তিত্ব নেই" "জাভাতে কখনই থাকবে না" এর মতো নয়।
কলিনড

9
@ ওয়েবিনেটর: বেশ কয়েকটি পোস্টার মন্তব্য করেছেন যে একটি প্রস্তাব জমা দেওয়া হয়েছিল তবে প্রত্যাখ্যান করা হয়েছে। সুতরাং উত্তরটি 100% নির্ভুল। ডাউন ভোটের বিরুদ্ধে লড়াই করার জন্য উত্সাহ দেওয়া।
জেরেমিপ

4
@ কলিনড খারাপ অভ্যাসটি যখন আপনি এই কুশ্রী কোডটি ছেড়ে যান এবং ব্যবহার Optionalএবং mapস্টাফ করার সিদ্ধান্ত নেন । মানটি যদি কম হয় তবে আমরা সমস্যাটি লুকিয়ে রাখছি না যার অর্থ এটি কখনও কখনও নাল হয়ে যায় বলে আশা করা হয় এবং আপনাকে এটি পরিচালনা করতে হবে। কখনও কখনও ডিফল্ট মানগুলি পুরোপুরি যুক্তিসঙ্গত হয় এবং এটি কোনও খারাপ অভ্যাস নয়।
এমকাজেম আখগারি

4
জাভা কিছুটা আধুনিক হতে অস্বীকার করেছে। এই ভাষাটি ইতিমধ্যে বন্ধ করে দিন।
প্লাগন


19

"অভাবের সমাধানের এক উপায়?" অপারেটরটি জাভা 8 ব্যবহার করে ট্র্যাশ-ক্যাচের ওভারহেড ছাড়াই (যা NullPointerExceptionঅন্য কোথাও একটি উত্পন্ন উত্সও লুকিয়ে রাখতে পারে ) জাভা -8-স্ট্রিম স্টাইলে "পাইপ" পদ্ধতিতে একটি শ্রেণি তৈরি করা।

public class Pipe<T> {
    private T object;

    private Pipe(T t) {
        object = t;
    }

    public static<T> Pipe<T> of(T t) {
        return new Pipe<>(t);
    }

    public <S> Pipe<S> after(Function<? super T, ? extends S> plumber) {
        return new Pipe<>(object == null ? null : plumber.apply(object));
    }

    public T get() {
        return object;
    }

    public T orElse(T other) {
        return object == null ? other : object;
    }
}

তারপরে, প্রদত্ত উদাহরণটি হয়ে উঠবে:

public String getFirstName(Person person) {
    return Pipe.of(person).after(Person::getName).after(Name::getGivenName).get();
}

[সম্পাদনা]

আরও চিন্তাভাবনা করার পরে, আমি বুঝতে পেরেছিলাম যে কেবলমাত্র স্ট্যান্ডার্ড জাভা 8 ক্লাস ব্যবহার করে এটি অর্জন করা সম্ভব:

public String getFirstName(Person person) {
    return Optional.ofNullable(person).map(Person::getName).map(Name::getGivenName).orElse(null);
}

এই ক্ষেত্রে, এটি প্যারামিটার হিসাবে পাস করার "<no first name>"পরিবর্তে একটি ডিফল্ট মান (পছন্দ ) পছন্দ করা এমনকি সম্ভব ।nullorElse


আমি আপনার প্রথম সমাধান আরও ভাল পছন্দ। Pipeকোনও orElseকার্যকারিতা মানিয়ে নিতে আপনি কীভাবে আপনার শ্রেণীর উন্নতি করবেন যাতে আমি orElseপদ্ধতির অভ্যন্তরে একটি নির্বিচার নন-নাল বস্তুকে পাস করতে পারি ?
থানোস ফিশারম্যান

@ থানোস ফিশারম্যান আমি orElseপদ্ধতিটি Pipeক্লাসে যুক্ত করেছি ।
হেলদার পেরেইরা


7

এটি আসলে গ্রোভির সেফ-ডেরেফারেন্স অপারেটর । আপনি খাঁটি জাভাতে এটি ব্যবহার করতে পারবেন না (দুঃখের সাথে), যাতে পোস্টটি কেবল ভুল (বা সম্ভবত গ্রোভিকে "জাভার সাম্প্রতিক সংস্করণ" হিসাবে দাবি করা যদি কিছুটা ভুল হয়)।


4
সুতরাং নিবন্ধটি ভুল ছিল - নেটিভ জাভাতে সিনট্যাক্সের অস্তিত্ব নেই। হুঁ।
এরটি সিডোহল

তবে লিঙ্কটি নষ্ট হয়েছে
bvdb

6

জাভাতে সঠিক বাক্য গঠন নেই তবে জেডিকে -8 অনুসারে, আমাদের কাছে বিভিন্ন পদ্ধতি সহ with চ্ছিক এপিআই রয়েছে। সুতরাং, নাল কন্ডিশনাল অপারেটরের ব্যবহারের সাথে সি # সংস্করণ :

return person?.getName()?.getGivenName(); 

Java চ্ছিক এপিআই দিয়ে জাভাতে নিম্নলিখিত হিসাবে লেখা যেতে পারে :

 return Optional.ofNullable(person)
                .map(e -> e.getName())
                .map(e -> e.getGivenName())
                .orElse(null);

যদি কোনও হয় person, getNameবা getGivenNameশূন্য হয় তবে নালটি ফেরত দেওয়া হবে।


2

জাভা 8 ল্যাম্বদা দিয়ে প্রায় সুন্দর পদ্ধতিতে এটি সমাধান করে এমন ব্যবহার পদ্ধতিগুলি সংজ্ঞায়িত করা সম্ভব।

এটি এইচ-ম্যানস সমাধানের ভিন্নতা তবে এটি ধরার পরিবর্তে একাধিক পদক্ষেপগুলি পরিচালনা করতে একাধিক যুক্তিযুক্ত ওভারলোডেড পদ্ধতি ব্যবহার করেNullPointerException

এমনকি যদি আমি মনে করি যে এই সমাধানটি এক ধরণের শীতল, তবে আমি মনে করি যে আমি হেলদার পেরিরার সেকেন্ডটিকে বেশি পছন্দ করি কারণ এর কোনও ব্যবহার পদ্ধতির প্রয়োজন নেই।

void example() {
    Entry entry = new Entry();
    // This is the same as H-MANs solution 
    Person person = getNullsafe(entry, e -> e.getPerson());    
    // Get object in several steps
    String givenName = getNullsafe(entry, e -> e.getPerson(), p -> p.getName(), n -> n.getGivenName());
    // Call void methods
    doNullsafe(entry, e -> e.getPerson(), p -> p.getName(), n -> n.nameIt());        
}

/** Return result of call to f1 with o1 if it is non-null, otherwise return null. */
public static <R, T1> R getNullsafe(T1 o1, Function<T1, R> f1) {
    if (o1 != null) return f1.apply(o1);
    return null; 
}

public static <R, T0, T1> R getNullsafe(T0 o0, Function<T0, T1> f1, Function<T1, R> f2) {
    return getNullsafe(getNullsafe(o0, f1), f2);
}

public static <R, T0, T1, T2> R getNullsafe(T0 o0, Function<T0, T1> f1, Function<T1, T2> f2, Function<T2, R> f3) {
    return getNullsafe(getNullsafe(o0, f1, f2), f3);
}


/** Call consumer f1 with o1 if it is non-null, otherwise do nothing. */
public static <T1> void doNullsafe(T1 o1, Consumer<T1> f1) {
    if (o1 != null) f1.accept(o1);
}

public static <T0, T1> void doNullsafe(T0 o0, Function<T0, T1> f1, Consumer<T1> f2) {
    doNullsafe(getNullsafe(o0, f1), f2);
}

public static <T0, T1, T2> void doNullsafe(T0 o0, Function<T0, T1> f1, Function<T1, T2> f2, Consumer<T2> f3) {
    doNullsafe(getNullsafe(o0, f1, f2), f3);
}


class Entry {
    Person getPerson() { return null; }
}

class Person {
    Name getName() { return null; }
}

class Name {
    void nameIt() {}
    String getGivenName() { return null; }
}

1

আমি নিশ্চিত না যে এটি এমনকি কার্যকর হবে; যদি, বলুন, ব্যক্তির রেফারেন্সটি শূন্য ছিল, রানটাইম কীসের সাথে এটি প্রতিস্থাপন করবে? একজন নতুন ব্যক্তি? এর জন্য ব্যক্তির কিছু ডিফল্ট সূচনা হওয়া দরকার যা আপনি এই ক্ষেত্রে আশা করতে পারেন। আপনি নাল রেফারেন্স ব্যতিক্রম এড়াতে পারেন তবে আপনি যদি এই ধরণের সেটআপগুলির জন্য পরিকল্পনা না করেন তবে আপনি অনির্দেশ্য আচরণ পাবেন।

দ্য ?? সি # তে অপারেটরকে "কোলেসেস" অপারেটর হিসাবে সেরা বলা যেতে পারে; আপনি বেশ কয়েকটি অভিব্যক্তি শৃঙ্খলাবদ্ধ করতে পারেন এবং এটি প্রথমটি বাতিল করবে যা শূন্য নয়। দুর্ভাগ্যক্রমে, জাভা এটি নেই। আমি মনে করি যে আপনি সবচেয়ে ভাল করতে পারেন নাল চেকগুলি সম্পাদনের জন্য টের্নারি অপারেটরটি ব্যবহার করা এবং যদি চেইনের কোনও সদস্য শূন্য থাকে তবে পুরো অভিব্যক্তির কোনও বিকল্প মূল্যায়ন করুন:

return person == null ? "" 
    : person.getName() == null ? "" 
        : person.getName().getGivenName();

আপনি চেষ্টাও ব্যবহার করতে পারেন:

try
{
   return person.getName().getGivenName();
}
catch(NullReferenceException)
{
   return "";
}

4
"রানটাইম কী দিয়ে এটি প্রতিস্থাপন করবে?" ... প্রশ্ন পড়তে সাহায্য করতে পারে :-P এটি নাল দিয়ে প্রতিস্থাপন করবে। সাধারণভাবে, ধারণাটি সেই ব্যক্তিরই বলে মনে হচ্ছে? .GetName ব্যক্তি শূন্য হলে শূন্য করতে বা person.getName না হলে মূল্যায়ন করে। সুতরাং এটি আপনার সমস্ত উদাহরণগুলিতে নাল দিয়ে "" প্রতিস্থাপন করার মতো।
সাবউব

4
একটি নালরফেরানএক্সেপশনও নিক্ষেপ করা যেতে পারে getName()বা getGivenName()যা আপনি জানতে পারবেন না যে আপনি সমস্ত ঘটনার জন্য খালি স্ট্রিংটি কেবল ফিরিয়ে দেন কিনা।
জিমি টি।

4
জাভাতে এটি নুলপয়েন্টার এক্সসেপশন।
টুপর্টুনট

সি # তে, person?.getName()?.getGivenName() ?? ""আপনার প্রথম উদাহরণের সমতুল্য, ব্যতিক্রম ছাড়া যদি getGivenName()এটি শূন্য হয় তবে এটি প্রদান করবে""
অস্টিন_এন্ডারসন

0

এটি আপনার কাছে আছে, জাভা 8-এ নাল-নিরাপদ অনুরোধ:

public void someMethod() {
    String userName = nullIfAbsent(new Order(), t -> t.getAccount().getUser()
        .getName());
}

static <T, R> R nullIfAbsent(T t, Function<T, R> funct) {
    try {
        return funct.apply(t);
    } catch (NullPointerException e) {
        return null;
    }
}

আমি এই চেষ্টা করতে হবে। এই পুরো "ptionচ্ছিক" ব্যবসায় সম্পর্কে এসআইয়ের গুরুতর সন্দেহ রয়েছে। খারাপ লাগার মতো লাগে।
ggb667

4
এলভিস অপারেটর প্রস্তাবের পুরো উদ্দেশ্যটি এক লাইনে এটি করা। উপরের "যদি (! = নাল) পদ্ধতির চেয়ে এই পদ্ধতির চেয়ে ভাল নয়। আসলে আমি যুক্তি দিয়ে বলব যে এটি আরও
সরু

@ ড্যারন যেমন অন্য উত্তরে বলেছিলেন, এখানেও একই প্রয়োগ রয়েছে: "এই স্টাইলের সমস্যাটি হল নুলপয়েন্টার এক্সেপশনটি আপনি যেখান থেকে প্রত্যাশা করেছিলেন সেখান থেকে না আসতে পারে। সুতরাং এটি একটি সত্যিকারের বাগ লুকিয়ে রাখতে পারে।"
হেলদার পেরেরা

0

যদি কেউ পুরানো জাভা সংস্করণের বিকল্প খুঁজছেন, আপনি লিখেছেন এমনটি চেষ্টা করে দেখতে পারেন:

/**
 * Strong typed Lambda to return NULL or DEFAULT VALUES instead of runtime errors. 
 * if you override the defaultValue method, if the execution result was null it will be used in place
 * 
 * 
 * Sample:
 * 
 * It won't throw a NullPointerException but null.
 * <pre>
 * {@code
 *  new RuntimeExceptionHandlerLambda<String> () {
 *      @Override
 *      public String evaluate() {
 *          String x = null;
 *          return x.trim();
 *      }  
 *  }.get();
 * }
 * <pre>
 * 
 * 
 * @author Robson_Farias
 *
 */

public abstract class RuntimeExceptionHandlerLambda<T> {

    private T result;

    private RuntimeException exception;

    public abstract T evaluate();

    public RuntimeException getException() {
        return exception;
    }

    public boolean hasException() {
        return exception != null;
    }

    public T defaultValue() {
        return result;
    }

    public T get() {
        try {
            result = evaluate();
        } catch (RuntimeException runtimeException) {
            exception = runtimeException;
        }
        return result == null ? defaultValue() : result;
    }

}

0

আপনি যে কোডটি সরবরাহ করেছেন সেটি পরীক্ষা করতে পারেন এবং এটি সিনট্যাক্স ত্রুটি দেবে o সুতরাং এটি জাভাতে সমর্থিত নয়। গ্রোভি এটি সমর্থন করে এবং এটি জাভা 7 এর জন্য প্রস্তাব করা হয়েছিল (তবে কখনই এটি অন্তর্ভুক্ত হয়নি)।

তবে আপনি জাভা ৮ তে প্রদত্ত ptionচ্ছিক ব্যবহার করতে পারেন এটি অনুরূপ লাইনে কিছু অর্জনে আপনাকে সহায়তা করতে পারে। https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html

Codeচ্ছিক জন্য উদাহরণ কোড


0

আপনার ইনস্টল করা ওএস> = 24 না থাকলে অ্যান্ড্রয়েড ল্যাম্বদা ফাংশন সমর্থন করে না, তাই আমাদের প্রতিবিম্ব ব্যবহার করা দরকার।

// Example using doIt function with sample classes
public void Test() {
    testEntry(new Entry(null));
    testEntry(new Entry(new Person(new Name("Bob"))));
}

static void testEntry(Entry entry) {
    doIt(doIt(doIt(entry,  "getPerson"), "getName"), "getName");
}

// Helper to safely execute function 
public static <T,R> R doIt(T obj, String methodName) {
    try {
       if (obj != null) 
           return (R)obj.getClass().getDeclaredMethod(methodName).invoke(obj);
    } catch (Exception ignore) {
    }
    return null;
}
// Sample test classes
    static class Entry {
        Person person;
        Entry(Person person) { this.person = person; }
        Person getPerson() { return person; }
    }

    static class Person {
        Name name;
        Person(Name name) { this.name = name; }
        Name getName() { return name; }
    }

    static class Name {
        String name;
        Name(String name) { this.name = name; }
        String getName() {
            System.out.print(" Name:" + name + " ");
            return name;
        }
    }
}

-4

এটি যদি আপনার পক্ষে পারফরম্যান্সের সমস্যা না হয় তবে আপনি লিখতে পারেন

public String getFirstName(Person person) {
  try {
     return person.getName().getGivenName();
  } catch (NullPointerException ignored) {
     return null;
  }
} 

8
এই শৈলীতে সমস্যা হ'ল নুলপয়েন্টার এক্সেপশনটি যেখানে আপনি এটি প্রত্যাশা করেছিলেন সেখান থেকে নাও আসতে পারে। এবং এইভাবে এটি একটি বাস্তব বাগ লুকিয়ে রাখতে পারে।
ডারন

4
@ ড্যারন, আপনি কী লিখেছেন এমন কোনও উদাহরণ দিতে পারেন যা একটি এনপিই ফেলতে পারে এবং কীভাবে আপনি এটি অন্যভাবে পরিচালনা করতে চান?
পিটার লরি

4
আপনি এটিকে একটি পৃথক ভেরিয়েবলে চালিত করেন এবং সাধারণ হিসাবে যদি এটি পরীক্ষা করেন। এই অপরিষ্কারের পিছনে ধারণাটি হল সেই কুৎসিততা দূর করা। ড্যারন ঠিক আছে, আপনার সমাধানটি আপনি ফেলে দিতে চান এমন ব্যতিক্রমগুলি লুকিয়ে থাকতে পারে এবং ফেলে দিতে পারে। যেমন getName()আপনি অভ্যন্তরীণভাবে একটি ব্যতিক্রম ছুঁড়ে ফেলেছেন যা আপনি ফেলে দিতে চান না।
মাইক মিলার

4
কোনও ব্যতিক্রম নয়, এটি নালপয়েন্টার এক্সেকশন হতে হবে। আপনি এমন একটি পরিস্থিতি থেকে নিজেকে রক্ষা করার চেষ্টা করছেন যা আপনি কোনও বাস্তব প্রয়োগে কীভাবে ঘটতে পারে তা ব্যাখ্যা করতে শুরু করেননি।
পিটার লরি

4
সত্যিকারের অ্যাপ্লিকেশনটিতে Personএকটি ডিবি বা কিছুটা নন-হিপ মেমরির অ্যাক্সেসের প্রক্সি হতে পারে এবং কোথাও একটি বাগ থাকতে পারে ... খুব বাস্তববাদী নয়, তবে, পিটার, আমি বাজি ধরেছি যে আপনি উপরের মতো কোনও কোড কখনও লিখেছেন নি written ।
মাআর্টিনাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.