मान लीजिए कि मेरे पास यह कोड है:

public class Car {
    private int fuel;

    public Car(int fuel) {
        if (fuel < 0) {
            throw new IllegalArgumentException("Can't be negative");
        }
        this.fuel = fuel;
    }

    public void setFuel(int fuel) {
        if (fuel < 0) {
            throw new IllegalArgumentException("Can't be negative");
        }
        this.fuel = fuel;
   }

मेरा सवाल यह है कि क्या मैं किसी भी तरह से कंस्ट्रक्टर और सेटर में डुप्लिकेट कोड से बच सकता हूं?

1
kkralj 15 नवम्बर 2015, 13:23

4 जवाब

सबसे बढ़िया उत्तर

अधिकांश डुप्लिकेट कोड के साथ, आप इसे एक विधि में बदल सकते हैं।

public class Car {
    private int fuel;

    public Car(int fuel) {
        checkFuel(fuel);
        this.fuel = fuel;
    }

    public void setFuel(int fuel) {
        checkFuel(fuel);
        this.fuel = fuel;
    }

    private static void checkFuel(int fuel) {
        if (fuel < 0) {
            throw new IllegalArgumentException("'fuel' argument can't be negative");
        }
    }

कंस्ट्रक्टर से setFuel क्यों नहीं कॉल करें? क्योंकि कंस्ट्रक्टर के भीतर आपके इंस्टेंस को पूरी तरह से इनिशियलाइज़ करने से पहले कॉल करने का तरीका त्रुटियों का स्रोत हो सकता है। विचार करें: एक उपवर्ग setFuel से आगे निकल जाता है और दुष्प्रभाव जोड़ता है। इस प्रश्न और उसके उत्तर में के बारे में अधिक जानकारी।

यहाँ एक और तरीका है, इसे भी एक विधि में बदलना:

public class Car {
    private int fuel;

    public Car(int fuel) {
        this.privateSetFuel(fuel);
    }

    public void setFuel(int fuel) {
        this.privateSetFuel(fuel);
    }

    private void privateSetFuel(int fuel) {
        if (fuel < 0) {
            throw new IllegalArgumentException("'fuel' argument can't be negative");
        }
        this.fuel = fuel;
    }

साइड नोट: नोटिस मैंने तर्क के नाम को अपवाद संदेश में जोड़ा।

1
Community 23 मई 2017, 12:23

आप सेटर को कॉल करने के लिए कंस्ट्रक्टर क्यों नहीं बदलते:

public Car(int fuel) {
    setFuel(fuel);
}
4
krock 15 नवम्बर 2015, 10:26

कंस्ट्रक्टर से सेटर को सीधे कॉल करें:

public class Car {
    private int fuel;

    public Car(int fuel) {
        setFuel(fuel);
    }

    public void setFuel(int fuel) {
        if (fuel < 0) {
            throw new IllegalArgumentException("Can't be negative");
        }
        this.fuel = fuel;
   }
1
Mohammed Aouf Zouag 15 नवम्बर 2015, 10:26

हाँ। अपने निर्माता के भीतर से सेट ईंधन (ईंधन) का आह्वान करें।

1
Jan 15 नवम्बर 2015, 10:26