0

これは私の最初の投稿なので、正しく行われなかった場合は申し訳ありません。このプログラムは私のAPコンピュータサイエンスコース用です(コードのサンプルは必要ありません。これが発生する理由の説明だけです)。オブジェクトから変数を取得しようとすると、変数が存在しないというエラーが表示されます(NetBeansIDE)。前もって感謝します!

これはコードです:

public class AnnualFuelTester 
{   
    public static void main(String [] args)
    {
        AnnualFuelUse Fill1 = new AnnualFuelUse(1, 1,  45023, 45231, 10.00, 2.95);
        AnnualFuelUse Fill2 = new AnnualFuelUse(2, 4,  45231, 45480, 11.70, 2.99);
        AnnualFuelUse Fill3 = new AnnualFuelUse(3, 8,  45480, 45659,  9.30, 3.03);
        AnnualFuelUse [] FillArray = {Fill1, Fill2, Fill3};

        System.out.println("Fillup    Days    Start Miles    Distance    Gallons        Consumed    MpG    Fuel Price    Cost");
        **int temp = Fill1.distance;**
        System.out.printf ("%4.1f     %4.1f   %4.1f          %4.1f       %4.1f                   %4.1f  %4.1f         %4.1f", );
    }
}

(編集:) AnnualFuelUse:

public class AnnualFuelUse 
{
    private int dist = 0;
    private double MpG = 0;
    private double CoT = 0;
    private double totals = 0;
    private double projection = 0;
    private double min = 0;
    private double max = 0;

    Annual_Fuel_Use(int fillTemp, int daysTemp, int startTemp, int stopTemp, double gallTemp, double priceTemp){
        int fillNumber = fillTemp;                                       
        int daysSinceLastFill = daysTemp;                                       
        int startMiles = starttemp;                                     
        int stopMiles = stoptemp;                                       
        int distance = Annual_FuelUse.travelDistance(startMiles, stopMiles);
        double fuelConsumed = galltemp;
        double mPG = AnnualFuelUse.milesPerGal(dist, fuelConsumed);
        double pricePerGallon = pricetemp;
        double tripCost = AnnualFuelUse.costOfTrip(pricePerGallon, fuelConsumed);
    }

    public double getMilesPerGal(){
        return MpG;        
    }

    public int getTravelDistance(){
        return dist;        
    }

    public double getCostOfTrip(){
        return CoT;        
    }

    public double getTotals(){
        return totals;
    }

    public double getProjection(){
        return projection;
    }



    public int travelDistance(int distance1, int distance2){   
        dist = distance2 - distance1;
        return dist;
    }

    public double milesPerGal(int travelDistance, double fuelConsumed){        
        MpG = travelDistance / fuelConsumed;
        return MpG;
    }

    public double costOfTrip(double pricePerGal, double fuelConsumed){        
    CoT = pricePerGal * fuelConsumed;
        return CoT;
    }

    public double totals(double dat1, double dat2, double dat3){
        totals = dat1 + dat2 + dat3;
        return totals;
    }

    public double projection(int days,double projected){
        projection = (projected / days) * 365;
        return projection;
    }

    public double dataMin(int dat1, int dat2, int dat3){
        if (dat1 <= dat2){
            min = dat1;
        }
        if (min <= dat3){
            return min;
        } else {
            return dat3;
        }
    }

    public double dataMax(int dat1, int dat2, int dat3){
        if (dat1 >= dat2){
            max = dat1;
        }
        if (max >= dat3){
            return max;
        } else {
            return dat3;
        }
    }
}
4

3 に答える 3

2

staticフィールドを誤って使用していることに気づきました。コンストラクターに静的フィールドを設定することは、混乱の悪夢につながるため、避ける必要があります。

私はあなたに提案します

  • すべてのフィールドを非静的にし、それらを使用するすべてのメソッドを非静的にします。これを行わないと、すべてのオブジェクトが実際には同じフィールドを使用しており、独自のフィールドは使用していません。
  • ゲッターをフィールド名と一致させます。できるだけ一貫性を保つようにしてください。そうしないと、混乱を招く可能性もあります。たとえばtravelDistance、フィールドを同じ名前にする場合があります。明確にしたい場合は、getterメソッドを作成してくださいgetTravelDistance
  • 破棄する変数をたくさん設定しないでください。有用なコードのみを保持してください。これも混乱を招く可能性があります。
  • クラス名にアンダースコアを使用しないでください。

一般に、一貫性を保つ必要があります。たとえば、最小/最大メソッドの半分は数学を使用して実装され、半分は独自のコードを使用して実装されます。

続行する前に、すべてのコードを修正することをお勧めします。

于 2012-12-14T14:49:05.170 に答える
1

Java (Bean) クラスの設計にいくつかの基本的な欠陥があり、ご覧のとおり、これが使用上の問題につながっています。

  • 最も差し迫った問題は、スコープ/可視性の 1 つです。クラス変数はプライベートに宣言されています。つまり、クラス自体の外では見えません。それらを現在の方法で (メイン メソッドで) 使用するには、それらをパブリックまたはパッケージ プライベートにする必要があります。しかし、いけません!以下のポイントを参照してください。

  • クラス変数を非公開にするのは正しいことです。これは、カプセル化の原則によるものです。オブジェクトは、対話するための一貫したインターフェイスを提供しながら、内部実装を可能な限り非表示にする必要があります。欠けているのは、呼び出し元がオブジェクトの内部状態を操作するために使用できるゲッター/セッターです。それらを追加してください!

  • クラス変数はまさにそれです-クラス変数です!これは、それらを静的にしたためです。これは、クラスのすべてのインスタンスが同じ値を共有することを意味します-それはあなたが意図したものではないと確信しています. これらのフィールドの static キーワードを削除して、これを修正してください。また、すべてのクラス メソッドから static キーワードを削除します。

  • 最後に、適切なJava Naming Conventionsを使用していません。そうすることで、自分自身と他の人の両方にとって、コードが読みやすくなります。私を信じてください。これらの規則に従えば、従わない場合よりもはるかに迅速にバグを特定、診断、および修正できます。

Java (Bean) クラスは次のようになります。

public class AnnualFuelUse {
    private int dist = 0;
    private double MpG = 0;
    private double CoT = 0;
    private double totals = 0;
    private double projection = 0;

    // Constructors

    // Non-static getters/setters

    // Other methods
}

呼び出しクラスは次のようになります。

public class AnnualFuelTester {   
    public static void main(String [] args) {
        AnnualFuelUse fill1 = new AnnualFuelUse(1, 1,  45023, 45231, 10.00, 2.95);
        int temp = fill1.getDistance();
    }
}

それは正しい方向にあなたのスタートを切るはずです。

于 2012-12-14T15:57:31.407 に答える