如何存储类的类型以供以后在Java中使用?

时间:2014-11-26 04:20:39

标签: java oop classloader

我有以下类型:

public class Vehicle { ... }

通过用户动作实例化车辆。将其视为发明游戏,用户可以创建他/她想要的任何类型的车辆。对于车辆的每个物体,我需要定期记录物体的状态。所以我有以下课程:

public abstract class Log { ... }
public class LogTyre extends Log { ... }
public class LogHandle extends Log { ... }
public class LogBrake extends Log { ... }
public class LogEngine extends Log { ... }
...etc...

另外一个复杂因素是每辆车都有不同的日志记录要求。例如,自行车型车辆不需要LogEngine对象。

因此,在我实例化车辆时,我需要存储车辆所需的日志类型的类类型。因此,当需要执行日志时,记录器将能够为该特定车辆实例化必要的日志记录类。我怎样才能在Java中实现这一目标?或者也许只是在OOP中。

任何帮助将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:0)

假设您需要访问的方法是由日志定义的,您是否可以在日志类中添加“日志类型”枚举,以便查找每个日志?类似的东西:

private void logStuff(LogType logType, Map<LogType, Log> vehicleLogs){
    Log log = vehicleLogs.get(logType);

    if(log != null){
        log.doLogStuff();
    }
}

其中LogType具有Handle,Engine等值

答案 1 :(得分:0)

我不确定我是否正确理解了您的问题。但是,在Hovercraft Full of Eels的提示下,编写了以下代码。您可以添加其他类型的日志。希望这有用。

import java.io.PrintStream;
import java.util.ArrayList;

public class Logger {
    public static void main(String[] args) {
        // creating vehicles
        Vehicle[] vs = { new Vehicle("Bike"), new Vehicle("Car") };

        // adding logs of different type
        vs[0].addLog(new LogTyre("Slim"));
        vs[1].addLog(new LogTyre("Wide"));
        vs[1].addLog(new LogEngine("Lean burn"));

        // maintaining logs
        Logger logger = new Logger();
        for (Vehicle v: vs)
            v.writeLog(logger);

        // printing logs
        for (Vehicle v: vs)
            v.printLogs();
    }
    public void write(Log log) {
        System.out.printf(".. writing to %s.%n", log.name());
        // You may write different logs depending on the log types using common methods
    }
}

class Vehicle {
    String type;            // vehicle type
    ArrayList<Log> logs;    // logs to be maintained
    public Vehicle(String type) {
        this.type = type;
        logs = new ArrayList<Log>();
    }
    public void addLog(Log log) {
        logs.add(log);
    }
    public void writeLog(Logger w)  {
        for (Log log: logs)
            log.accept(w);
    }
    public void printLogs() {
        for (Log log: logs) {
            log.print(System.out);
        }
    }
}

abstract class Log {
    protected String name;  // common fields
    // accepting the visitor
    public void accept(Logger logger) {
        logger.write(this);
    }
    // common methods for maintaining logs
    public abstract String name();
    public void print(PrintStream ps) {
        ps.printf("[Log: %s]%n", name());
    }
}

class LogTyre extends Log {
    public LogTyre(String name) {
        super.name = name;
    }
    public String name() {
        return name+" Tyre Log";
    }
}

class LogEngine extends Log {
    public LogEngine(String name) {
        super.name = name;
    }
    public String name() {
        return name+" Engine Log";
    }
}

上述代码的这个键是使用accept方法将Logger传递给Log。然后这个accept方法将调用各种类型日志的相应write方法。