1. ホーム
  2. ジャワ

[解決済み] Netbeansの警告。パブリックAPIでパブリックでない型をエクスポートしている [終了しました]

2022-03-04 16:36:33

質問

Slick2Dのゲームを作っています。今、Videoクラスを作成していますが、このクラスにはインナークラス(FrameSize, FPS, FullScreen...)が含まれています。そこで、System.out.println()を呼び出すような方法でクレートするOODのアイディアがあった。それは、私がpublic Videoクラスと彼の内部クラスのpublic staticインスタンスを持つことを意味しますが、netbeans IDEは私に"Exporting non-public type through public 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;
        }

    }

}

AUDIO

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;
        }

    }

}

解決方法は?

Video クラスはパブリッククラス変数の宣言を含んでいます frameSize 型の FrameSize .
A public 修飾子の意味は frameSize 変数がすべて表示されます。

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はこれについて警告します。なぜなら、ほとんどの場合、これは意図しないエラーだからです。
の中で他のクラスからしかアクセスできないようにしたい場合、その変数は 同じパッケージ として宣言します。 protected ではなく public .
しかし、意図的な宣言である場合は、警告を無視してそのままにしておきます。