9

我正在创建一个 Slick2D 游戏。现在,我正在创建一个 Video 类,其中包含内部类(FrameSize、FPS、FullScreen..)。所以我有一个 OOD 想法来装箱,就像我们调用 System.out.println() 一样。这意味着我将拥有他的内部类的公共视频类和公共静态实例,但是 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

Videoclass 包含frameSize类型为 的公共类变量的声明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 会就此向您发出警告,因为这很可能是无意的错误 - 为什么您要让所有人都可以访问某个字段值而不发布该字段的类型,这实际上阻止了他们使用该字段?

如果您想让该变量只能被同一包中的其他类访问,请将其声明为protected, not public
但如果这是一个有意的声明 - 那么忽略警告并保持原样。

于 2013-09-22T15:14:49.863 回答