9

Slick2D ゲームを作成しています。現在、内部クラス (FrameSize、FPS、FullScreen など) を含む Video クラスを作成しています。そこで、System.out.println() を呼び出すような方法でクレートする OOD のアイデアがありました。つまり、私はパブリック Video クラスと彼の内部クラスのパブリック静的インスタンスを持つことになりますが、netbeans IDE は「パブリック API を介して非パブリック タイプをエクスポートしています」というヒントを表示します。では、それを無視して今までのやり方を続けるべきでしょうか、それともあなたのアイデアを教えていただけないでしょうか?

ビデオ

public class Video {

    public static FrameSize frameSize;
    public static FullScreen fullScreen;
    public static FPS fps;

    private Video() {}

    public static void loadArguments(Scanner loadInput) {
        boolean isVideo = false;
        String readLine;

        while (loadInput.hasNext()) {
            readLine = loadInput.next();
            if (readLine.equalsIgnoreCase("video")) {
                isVideo = true;
                break;
            }
        }

        while (isVideo && loadInput.hasNext()) {
            readLine = loadInput.next();
            if (readLine.equalsIgnoreCase("end")) {
                break;
            }
            String[] line = readLine.split("=");

            String key = line[0];
            String value = line[1];

            switch (key) {
                case "width":
                    frameSize.setWidth(Integer.parseInt(value));
                    break;
                case "height":
                    frameSize.setHeight(Integer.parseInt(value));
                    break;
                case "fullscreen":
                    break;
                case "fps":
                    break;
                default:
                    System.err.println("Unknown video key: " + key);
                    break;
            }
        }
    }

    public static void saveArguments(String filePath) {
        Scanner saveInput;
        try {
            saveInput = new Scanner(new File(filePath));
        } catch (FileNotFoundException fne) {
            System.err.println("Invalid settings-file.");
            return;
        }

        // TO DO: save function

        saveInput.close();
    }

    class FrameSize {

        public final int[][] SIZE_VALUES = {
                {800, 600},
                {1000, 700},
                {1200, 800},
                {1400, 900}
        };

        private int index;
        private int width, height;

        private FrameSize() {}

        public void setSize(int width, int height) {
            this.width = width;
        }

        public int getWidth() {
            return width;
        }

        public void setWidth(int width) {
            this.width = width;
        }

        public int getHeight() {
            return height;
        }

        public void setHeight(int height) {
            this.height = height;
        }

        @Override
        public String toString() {
            return this.width + " x " + this.height;
        }

    }

    class FullScreen {

        private boolean fullScreen;

        private FullScreen() {}

        public boolean isFullScreen() {
            return fullScreen;
        }

        public void setFullScreen(boolean fullScreen) {
            this.fullScreen = fullScreen;
        }

        @Override
        public String toString() {
            return "" + fullScreen;
        }        
    }

    class FPS {

        private boolean FPS;

        private FPS() {}

        public boolean isFPS() {
            return FPS;
        }

        public void setFPS(boolean FPS) {
            this.FPS = FPS;
        }        

        @Override
        public String toString() {
            return "" + fps;
        }

    }

}

オーディオ

public class Audio {

    private static Sound sound;
    private static Volume volume;

    private Audio() {}

    public void loadArguments(Scanner loadInput) {
        boolean isAudio = false;
        String readLine;

        while (loadInput.hasNext()) {
            readLine = loadInput.next();
            if (readLine.equalsIgnoreCase("audio")) {
                isAudio = true;
                break;
            }
        }

        while (isAudio && loadInput.hasNext()) {
            readLine = loadInput.next();
            if (readLine.equalsIgnoreCase("end")) {
                break;
            }
            String[] line = readLine.split("=");

            String key = line[0];
            String value = line[1];

            switch (key) {
                case "sound":
                    break;
                case "volume":
                    break;
                default:
                    System.err.println("Unknown audio key: " + key);
                    break;
            }
        }
    }

    public void saveArguments(String filePath) {
        Scanner saveInput;
        try {
            saveInput = new Scanner(new File(filePath));
        } catch (FileNotFoundException fne) {
            System.err.println("Invalid settings-file.");
            return;
        }

        // TO DO: save function

        saveInput.close();
    }

    class Sound {

        private boolean sound;

        private Sound() {}

        public boolean isSound() {
            return sound;
        }

        public void setSound(boolean sound) {
            this.sound = sound;
        }

        @Override
        public String toString() {
            return "" + sound;
        }        
    }

    class Volume {

        private static final double PITCH = 0.1d;
        private double volume;

        private Volume() {}

        public double getVolume() {
            return volume;
        }

        public void setVolume(double volume) {
            this.volume = volume;
        }

        public void increaseVolume() {
            if (!isVolumeRange(this.volume)) {
                return;
            }
            this.volume = this.volume + PITCH;
        }

        public void decreaseVolume() {
            if (!isVolumeRange(this.volume)) {
                return;
            }
            this.volume = this.volume - PITCH;
        }

        public boolean isVolumeRange(double volume) {
            return volume >= 0.0 && volume <= 10.0;
        }

    }

}
4

1 に答える 1

12

VideoframeSizeclass には、タイプの public クラス変数の宣言が含まれていますFrameSize。修飾子とは、その変数がすべての人に見えることを
意味します。publicframeSize

package package1;

public class Video {
   public static FrameSize frameSize;
}
// private class
class FrameSize {
}

ただしFrameSize、これはローカル クラスです。同じパッケージのメンバーにのみ表示されます。上記の例では、パッケージのメンバーのみがpackage1そのクラスを認識でき、以下のコードは正常にコンパイルされます。

package package1;

public class Test {

    void test(){
        FrameSize x = Video.frameSize;
    }
}

ただし、このコード (別のパッケージ) ではコンパイル エラーが発生します。

package package2;
import package1.*;

public class Test {
  void test(){
    // this line won't compile - FrameSize class is unknown
    FrameSize x = Video.frameSize; 

    // but this line compiles fine - Object class is public
    Object y = Video.frameSize; 
   }
}

ほとんどの場合、これは意図しないエラーであるため、NetBeans はこれについて警告します。このフィールドのタイプを公開せずに、あるフィールド値をすべての人がアクセスできるようにする必要があるのはなぜですか。同じパッケージ

内の他のクラスだけが変数にアクセスできるようにしたい場合は、変数をではなくとして宣言します。 ただし、それが意図的な宣言である場合は、警告を無視してそのままにしておきます。protectedpublic

于 2013-09-22T15:14:49.863 に答える