论坛首页 Java企业应用论坛

国王和100个犯人-

浏览 26011 次
该帖已经被评为新手帖
作者 正文
   发表时间:2010-01-17  
metaphy 写道

*********************************************************************
                           不 要 过 度 设 计!
*********************************************************************

太严肃了
0 请登录后投票
   发表时间:2010-01-17  
hkliya 写道
题目要求请看原帖http://www.iteye.com/topic/569275
此题的解题思路是:从100个犯人中指定一个作为计数员。当每天随机挑一个犯人放风时,如果是普通犯人,如果他是第一次放风并且灯是关着的,就把灯打开,如果是计数员,他看见灯开着,他就给关掉,并记录总共关了多少次灯,当关到99次时,说明所有人都放过风了。

下面是我自己感觉写的还行的代码,请大牛们帮我挑挑毛病
我的意思是这几个类的设计是否合理,哪个对象里应该持有哪个对象的引用这些方面
或者从扩展性,维护性来说有哪些不足,谢谢大家

===================================
已更新第二版代码,加入log4j和继承
package com.javaeye.hkliya.prisongame;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * 变态的国王
 * 
 * @author Administrator
 * 
 */
public class King {
    // 参与此变态游戏的犯人数
    public static final int COUNT_OF_PRISONERS = 100;
    // 游戏是否进行中
    private AtomicBoolean gameRunning = new AtomicBoolean();
    // 游戏进行的天数
    private int countOfDays;

    // 所有犯人
    private Prisoner[] prisoners = new Prisoner[COUNT_OF_PRISONERS];
    // 放过风的犯人
    private Set<Prisoner> outedPrisonersSet = new HashSet<Prisoner>();

    /**
     * 是否所有犯人都已放过风?
     * 
     * @return
     */
    private boolean isAllOuted() {
        return outedPrisonersSet.size() == COUNT_OF_PRISONERS;
    }

    /**
     * 某个犯人报告国王他完成了任务
     * 
     * @param prisoner
     *            来报告的犯人
     */
    public void accomplishTask(Prisoner prisoner) {
        gameRunning.set(false);
        System.out.println("犯:我亲爱的国王陛下,您的犯人编号" + prisoner.getUuid()
                + "可以肯定的告诉您,我的兄弟们全都到院子放过风了!");
        System.out.println("王:Oh, 真的吗?等我看一下记录先。。。");
        System.out.println("国王查看记录中。。。");
        System.out.println("5秒钟后。。。");
        if (isAllOuted()) {
            System.out.println("王:哇靠!真的呢!你不会是蒙的吧?");
            System.out.println("犯:My dear king! 吾已是戴罪之身,又岂敢再欺君犯上?且听我慢慢道来。。。");
            System.out.println("省略500字。。。");
            System.out
                    .println("王:人才!你TM真是个人才!虽然用了"
                            + countOfDays
                            + "天,不过还是达到要求了!I服了You!\n         "
                            + "(国王转头对旁边一公公道)小李子,免了他们的罪,每人发一张车票,让他们回家过年吧!\n         "
                            + "还有,把这个编号"
                            + prisoner.getUuid()
                            + "的留下,咱们那个软件部不是缺个HR经理吗?\n         就让他去,让他出逻辑题,考死那帮来面试的孙子!\n         哈哈哈。。。就这么办,朕先洗洗睡了。。。");
            return;
        }
        System.out.println("王:居然敢戏弄寡人,全部拉出去砍了!!!");
        System.out.println("犯:大王铙命啊!程序有Bug总是难免的嘛,让我再调试一下啊!");
    }

    /**
     * 开始游戏
     */
    public void startGame() {
        gameRunning.set(true);
        new Thread(new Runnable() {
            public void run() {
                Light light = new Light();
                Yard yard = new Yard();
                yard.setLight(light);

                for (int i = 0; i < COUNT_OF_PRISONERS; i++) {
                    Prisoner prisoner = new Prisoner(i, yard, King.this);
                    prisoners[i] = prisoner;
                }
                System.out.println("启禀陛下,要参加游戏的犯人已全部就位!");

                Random random = new Random();
                int randNum = random.nextInt(COUNT_OF_PRISONERS);
                prisoners[randNum].setAsCounter();
                System.out.println("犯人们经过商量,得出计谋,并随机选到编号" + randNum
                        + "的犯人作为计数员。。。");

                System.out.println("游戏开始!");
                // 没人报道游戏结束时,每天随机选出一个犯人到院子放风
                while (gameRunning.get()) {
                    int randIndex = random.nextInt(COUNT_OF_PRISONERS);
                    // System.out.println("今天选到" + randIndex);
                    prisoners[randIndex].outForExercise();

                    outedPrisonersSet.add(prisoners[randIndex]);
                    countOfDays++;
                    // 休息一天
                    // TimeUnit.DAYS.sleep(1);
                }
            }
        }).start();
    }

    public static void main(String[] args) {
        new King().startGame();
    }
}

package com.javaeye.hkliya.prisongame;

/**
 * 路灯
 * @author Administrator
 *
 */
public class Light {
    // 灯的状态,一开始是关着的
    private boolean state = false;
    
    /**
     * 开灯
     */
    public void turnOn() {
        state = true;
    }
    
    /**
     * 关灯
     */
    public void turnOff() {
        state = false;
    }
    
    /**
     * 灯是否开着?
     * @return true 表示灯开着
     *         false 表示灯关着
     */
    public boolean isOn() {
        return state;
    }
}

package com.javaeye.hkliya.prisongame;
/**
 * 犯人
 * @author Administrator
 *
 */
public class Prisoner {
    // 犯人编号
    private int uuid;
    
    // 是否计数员? true表示此犯人是计数员,false表示此犯人不是计数员
    private boolean isCounter;
    // 关灯次数
    private int turnOffTimes;
    // 此犯人放过风没?
    private boolean isFirstTime = true;
    
    private Yard yard;
    private King king;
    
    public Prisoner(int uuid, Yard yard, King king) {
        this.uuid = uuid;
        this.yard = yard;
        this.king = king;
    }
    
    /**
     * 指定此犯人为计数人
     */
    public void setAsCounter() {
        isCounter = true;
    }
    
    /**
     * 取得犯人的编号
     * @return 该犯人编号
     */
    public int getUuid() {
        return uuid;
    }
    
    /**
     * 放风
     */
    public void outForExercise() {
        Light light = yard.getLight();
        
        // 计数员
        if (isCounter) {
            if (light.isOn()) {
                light.turnOff();
                turnOffTimes++;
                if (turnOffTimes == King.COUNT_OF_PRISONERS-1) {
                    king.accomplishTask(this);
                }
            }
            return;
        }
        
        // 普通犯人
        if (isFirstTime && !light.isOn()) {
            light.turnOn();
            isFirstTime = false;
        }
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + uuid;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Prisoner other = (Prisoner) obj;
        if (uuid != other.uuid)
            return false;
        return true;
    }
}

package com.javaeye.hkliya.prisongame;

/**
 * 供犯人放风的院子
 * 
 * @author Administrator
 * 
 */
public class Yard {
    // 院子里有一盏路灯
    private Light light;

    public Light getLight() {
        return light;
    }

    public void setLight(Light light) {
        this.light = light;
    }
}

如果灯本来就开着的,计数员关99次灯够吗?
0 请登录后投票
   发表时间:2010-01-17  
wushexu 写道
要是我写就不会对那么多东西建模,没有必要

要是我就不回这么无聊的帖子,没有必要
0 请登录后投票
   发表时间:2010-01-17  
wannago 写道
hkliya 写道
题目要求请看原帖http://www.iteye.com/topic/569275
此题的解题思路是:从100个犯人中指定一个作为计数员。当每天随机挑一个犯人放风时,如果是普通犯人,如果他是第一次放风并且灯是关着的,就把灯打开,如果是计数员,他看见灯开着,他就给关掉,并记录总共关了多少次灯,当关到99次时,说明所有人都放过风了。

下面是我自己感觉写的还行的代码,请大牛们帮我挑挑毛病
我的意思是这几个类的设计是否合理,哪个对象里应该持有哪个对象的引用这些方面
或者从扩展性,维护性来说有哪些不足,谢谢大家

===================================
已更新第二版代码,加入log4j和继承
package com.javaeye.hkliya.prisongame;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * 变态的国王
 * 
 * @author Administrator
 * 
 */
public class King {
    // 参与此变态游戏的犯人数
    public static final int COUNT_OF_PRISONERS = 100;
    // 游戏是否进行中
    private AtomicBoolean gameRunning = new AtomicBoolean();
    // 游戏进行的天数
    private int countOfDays;

    // 所有犯人
    private Prisoner[] prisoners = new Prisoner[COUNT_OF_PRISONERS];
    // 放过风的犯人
    private Set<Prisoner> outedPrisonersSet = new HashSet<Prisoner>();

    /**
     * 是否所有犯人都已放过风?
     * 
     * @return
     */
    private boolean isAllOuted() {
        return outedPrisonersSet.size() == COUNT_OF_PRISONERS;
    }

    /**
     * 某个犯人报告国王他完成了任务
     * 
     * @param prisoner
     *            来报告的犯人
     */
    public void accomplishTask(Prisoner prisoner) {
        gameRunning.set(false);
        System.out.println("犯:我亲爱的国王陛下,您的犯人编号" + prisoner.getUuid()
                + "可以肯定的告诉您,我的兄弟们全都到院子放过风了!");
        System.out.println("王:Oh, 真的吗?等我看一下记录先。。。");
        System.out.println("国王查看记录中。。。");
        System.out.println("5秒钟后。。。");
        if (isAllOuted()) {
            System.out.println("王:哇靠!真的呢!你不会是蒙的吧?");
            System.out.println("犯:My dear king! 吾已是戴罪之身,又岂敢再欺君犯上?且听我慢慢道来。。。");
            System.out.println("省略500字。。。");
            System.out
                    .println("王:人才!你TM真是个人才!虽然用了"
                            + countOfDays
                            + "天,不过还是达到要求了!I服了You!\n         "
                            + "(国王转头对旁边一公公道)小李子,免了他们的罪,每人发一张车票,让他们回家过年吧!\n         "
                            + "还有,把这个编号"
                            + prisoner.getUuid()
                            + "的留下,咱们那个软件部不是缺个HR经理吗?\n         就让他去,让他出逻辑题,考死那帮来面试的孙子!\n         哈哈哈。。。就这么办,朕先洗洗睡了。。。");
            return;
        }
        System.out.println("王:居然敢戏弄寡人,全部拉出去砍了!!!");
        System.out.println("犯:大王铙命啊!程序有Bug总是难免的嘛,让我再调试一下啊!");
    }

    /**
     * 开始游戏
     */
    public void startGame() {
        gameRunning.set(true);
        new Thread(new Runnable() {
            public void run() {
                Light light = new Light();
                Yard yard = new Yard();
                yard.setLight(light);

                for (int i = 0; i < COUNT_OF_PRISONERS; i++) {
                    Prisoner prisoner = new Prisoner(i, yard, King.this);
                    prisoners[i] = prisoner;
                }
                System.out.println("启禀陛下,要参加游戏的犯人已全部就位!");

                Random random = new Random();
                int randNum = random.nextInt(COUNT_OF_PRISONERS);
                prisoners[randNum].setAsCounter();
                System.out.println("犯人们经过商量,得出计谋,并随机选到编号" + randNum
                        + "的犯人作为计数员。。。");

                System.out.println("游戏开始!");
                // 没人报道游戏结束时,每天随机选出一个犯人到院子放风
                while (gameRunning.get()) {
                    int randIndex = random.nextInt(COUNT_OF_PRISONERS);
                    // System.out.println("今天选到" + randIndex);
                    prisoners[randIndex].outForExercise();

                    outedPrisonersSet.add(prisoners[randIndex]);
                    countOfDays++;
                    // 休息一天
                    // TimeUnit.DAYS.sleep(1);
                }
            }
        }).start();
    }

    public static void main(String[] args) {
        new King().startGame();
    }
}

package com.javaeye.hkliya.prisongame;

/**
 * 路灯
 * @author Administrator
 *
 */
public class Light {
    // 灯的状态,一开始是关着的
    private boolean state = false;
    
    /**
     * 开灯
     */
    public void turnOn() {
        state = true;
    }
    
    /**
     * 关灯
     */
    public void turnOff() {
        state = false;
    }
    
    /**
     * 灯是否开着?
     * @return true 表示灯开着
     *         false 表示灯关着
     */
    public boolean isOn() {
        return state;
    }
}

package com.javaeye.hkliya.prisongame;
/**
 * 犯人
 * @author Administrator
 *
 */
public class Prisoner {
    // 犯人编号
    private int uuid;
    
    // 是否计数员? true表示此犯人是计数员,false表示此犯人不是计数员
    private boolean isCounter;
    // 关灯次数
    private int turnOffTimes;
    // 此犯人放过风没?
    private boolean isFirstTime = true;
    
    private Yard yard;
    private King king;
    
    public Prisoner(int uuid, Yard yard, King king) {
        this.uuid = uuid;
        this.yard = yard;
        this.king = king;
    }
    
    /**
     * 指定此犯人为计数人
     */
    public void setAsCounter() {
        isCounter = true;
    }
    
    /**
     * 取得犯人的编号
     * @return 该犯人编号
     */
    public int getUuid() {
        return uuid;
    }
    
    /**
     * 放风
     */
    public void outForExercise() {
        Light light = yard.getLight();
        
        // 计数员
        if (isCounter) {
            if (light.isOn()) {
                light.turnOff();
                turnOffTimes++;
                if (turnOffTimes == King.COUNT_OF_PRISONERS-1) {
                    king.accomplishTask(this);
                }
            }
            return;
        }
        
        // 普通犯人
        if (isFirstTime && !light.isOn()) {
            light.turnOn();
            isFirstTime = false;
        }
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + uuid;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Prisoner other = (Prisoner) obj;
        if (uuid != other.uuid)
            return false;
        return true;
    }
}

package com.javaeye.hkliya.prisongame;

/**
 * 供犯人放风的院子
 * 
 * @author Administrator
 * 
 */
public class Yard {
    // 院子里有一盏路灯
    private Light light;

    public Light getLight() {
        return light;
    }

    public void setLight(Light light) {
        this.light = light;
    }
}

如果灯本来就开着的,计数员关99次灯够吗?

为了简单,我是假设灯初始是关着的
这个原帖有讨论
0 请登录后投票
   发表时间:2010-01-17  
hkliya 写道
wannago 写道
hkliya 写道
题目要求请看原帖http://www.iteye.com/topic/569275
此题的解题思路是:从100个犯人中指定一个作为计数员。当每天随机挑一个犯人放风时,如果是普通犯人,如果他是第一次放风并且灯是关着的,就把灯打开,如果是计数员,他看见灯开着,他就给关掉,并记录总共关了多少次灯,当关到99次时,说明所有人都放过风了。

下面是我自己感觉写的还行的代码,请大牛们帮我挑挑毛病
我的意思是这几个类的设计是否合理,哪个对象里应该持有哪个对象的引用这些方面
或者从扩展性,维护性来说有哪些不足,谢谢大家

===================================
已更新第二版代码,加入log4j和继承
package com.javaeye.hkliya.prisongame;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * 变态的国王
 * 
 * @author Administrator
 * 
 */
public class King {
    // 参与此变态游戏的犯人数
    public static final int COUNT_OF_PRISONERS = 100;
    // 游戏是否进行中
    private AtomicBoolean gameRunning = new AtomicBoolean();
    // 游戏进行的天数
    private int countOfDays;

    // 所有犯人
    private Prisoner[] prisoners = new Prisoner[COUNT_OF_PRISONERS];
    // 放过风的犯人
    private Set<Prisoner> outedPrisonersSet = new HashSet<Prisoner>();

    /**
     * 是否所有犯人都已放过风?
     * 
     * @return
     */
    private boolean isAllOuted() {
        return outedPrisonersSet.size() == COUNT_OF_PRISONERS;
    }

    /**
     * 某个犯人报告国王他完成了任务
     * 
     * @param prisoner
     *            来报告的犯人
     */
    public void accomplishTask(Prisoner prisoner) {
        gameRunning.set(false);
        System.out.println("犯:我亲爱的国王陛下,您的犯人编号" + prisoner.getUuid()
                + "可以肯定的告诉您,我的兄弟们全都到院子放过风了!");
        System.out.println("王:Oh, 真的吗?等我看一下记录先。。。");
        System.out.println("国王查看记录中。。。");
        System.out.println("5秒钟后。。。");
        if (isAllOuted()) {
            System.out.println("王:哇靠!真的呢!你不会是蒙的吧?");
            System.out.println("犯:My dear king! 吾已是戴罪之身,又岂敢再欺君犯上?且听我慢慢道来。。。");
            System.out.println("省略500字。。。");
            System.out
                    .println("王:人才!你TM真是个人才!虽然用了"
                            + countOfDays
                            + "天,不过还是达到要求了!I服了You!\n         "
                            + "(国王转头对旁边一公公道)小李子,免了他们的罪,每人发一张车票,让他们回家过年吧!\n         "
                            + "还有,把这个编号"
                            + prisoner.getUuid()
                            + "的留下,咱们那个软件部不是缺个HR经理吗?\n         就让他去,让他出逻辑题,考死那帮来面试的孙子!\n         哈哈哈。。。就这么办,朕先洗洗睡了。。。");
            return;
        }
        System.out.println("王:居然敢戏弄寡人,全部拉出去砍了!!!");
        System.out.println("犯:大王铙命啊!程序有Bug总是难免的嘛,让我再调试一下啊!");
    }

    /**
     * 开始游戏
     */
    public void startGame() {
        gameRunning.set(true);
        new Thread(new Runnable() {
            public void run() {
                Light light = new Light();
                Yard yard = new Yard();
                yard.setLight(light);

                for (int i = 0; i < COUNT_OF_PRISONERS; i++) {
                    Prisoner prisoner = new Prisoner(i, yard, King.this);
                    prisoners[i] = prisoner;
                }
                System.out.println("启禀陛下,要参加游戏的犯人已全部就位!");

                Random random = new Random();
                int randNum = random.nextInt(COUNT_OF_PRISONERS);
                prisoners[randNum].setAsCounter();
                System.out.println("犯人们经过商量,得出计谋,并随机选到编号" + randNum
                        + "的犯人作为计数员。。。");

                System.out.println("游戏开始!");
                // 没人报道游戏结束时,每天随机选出一个犯人到院子放风
                while (gameRunning.get()) {
                    int randIndex = random.nextInt(COUNT_OF_PRISONERS);
                    // System.out.println("今天选到" + randIndex);
                    prisoners[randIndex].outForExercise();

                    outedPrisonersSet.add(prisoners[randIndex]);
                    countOfDays++;
                    // 休息一天
                    // TimeUnit.DAYS.sleep(1);
                }
            }
        }).start();
    }

    public static void main(String[] args) {
        new King().startGame();
    }
}

package com.javaeye.hkliya.prisongame;

/**
 * 路灯
 * @author Administrator
 *
 */
public class Light {
    // 灯的状态,一开始是关着的
    private boolean state = false;
    
    /**
     * 开灯
     */
    public void turnOn() {
        state = true;
    }
    
    /**
     * 关灯
     */
    public void turnOff() {
        state = false;
    }
    
    /**
     * 灯是否开着?
     * @return true 表示灯开着
     *         false 表示灯关着
     */
    public boolean isOn() {
        return state;
    }
}

package com.javaeye.hkliya.prisongame;
/**
 * 犯人
 * @author Administrator
 *
 */
public class Prisoner {
    // 犯人编号
    private int uuid;
    
    // 是否计数员? true表示此犯人是计数员,false表示此犯人不是计数员
    private boolean isCounter;
    // 关灯次数
    private int turnOffTimes;
    // 此犯人放过风没?
    private boolean isFirstTime = true;
    
    private Yard yard;
    private King king;
    
    public Prisoner(int uuid, Yard yard, King king) {
        this.uuid = uuid;
        this.yard = yard;
        this.king = king;
    }
    
    /**
     * 指定此犯人为计数人
     */
    public void setAsCounter() {
        isCounter = true;
    }
    
    /**
     * 取得犯人的编号
     * @return 该犯人编号
     */
    public int getUuid() {
        return uuid;
    }
    
    /**
     * 放风
     */
    public void outForExercise() {
        Light light = yard.getLight();
        
        // 计数员
        if (isCounter) {
            if (light.isOn()) {
                light.turnOff();
                turnOffTimes++;
                if (turnOffTimes == King.COUNT_OF_PRISONERS-1) {
                    king.accomplishTask(this);
                }
            }
            return;
        }
        
        // 普通犯人
        if (isFirstTime && !light.isOn()) {
            light.turnOn();
            isFirstTime = false;
        }
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + uuid;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Prisoner other = (Prisoner) obj;
        if (uuid != other.uuid)
            return false;
        return true;
    }
}

package com.javaeye.hkliya.prisongame;

/**
 * 供犯人放风的院子
 * 
 * @author Administrator
 * 
 */
public class Yard {
    // 院子里有一盏路灯
    private Light light;

    public Light getLight() {
        return light;
    }

    public void setLight(Light light) {
        this.light = light;
    }
}

如果灯本来就开着的,计数员关99次灯够吗?

为了简单,我是假设灯初始是关着的
这个原帖有讨论

哦。最好在发帖的时候写上这个假设,可以省大家点时间,因为原帖也没说这个条件,可能后来讨论有说(不过数十页的讨论...)。
0 请登录后投票
   发表时间:2010-01-17  
说句实在话,这个帖子是13最多的帖子!
0 请登录后投票
   发表时间:2010-01-17  
coreymylife 写道
说句实在话,这个帖子是13最多的帖子!

是啊,你不回帖的话还少一个
0 请登录后投票
   发表时间:2010-01-17  
从程序本身只能看到你的编程经验,是看不出工作年限的,当然你可以通过规范来显示,但是这个是要看习惯,而不是一段
show的代码。
但从楼主的口气我可以做如下猜测:
如果楼主没有毕业,而且是计算机系的,只有两个结果 1、大二 2、大四
如果楼主已经参与工作,而且是到一个算是正规的软件企业的话,那么楼主工作了2年以上3年以下。
第一年:被大牛所折服,不敢造次,知道山外有山。
第二年:潜心修练
第三年:会做些比较关键的代码,大牛比较信任,会将代码交给你写,开始有点飘。
如果大于三年,又是一个境界。
5年另外一个境界
8年则是一个峰会的情景,我想楼主不会,起码还有执着。

如果是一个作坊的话,或者去一个从别的行业进军软件的话,或者是一个非IT公司的话,那楼主工作年限在1年以下。
0 请登录后投票
   发表时间:2010-01-18  
群魔乱舞....
0 请登录后投票
   发表时间:2010-01-18  
faye.feelcool 写道
从程序本身只能看到你的编程经验,是看不出工作年限的,当然你可以通过规范来显示,但是这个是要看习惯,而不是一段
show的代码。
但从楼主的口气我可以做如下猜测:
如果楼主没有毕业,而且是计算机系的,只有两个结果 1、大二 2、大四
如果楼主已经参与工作,而且是到一个算是正规的软件企业的话,那么楼主工作了2年以上3年以下。
第一年:被大牛所折服,不敢造次,知道山外有山。
第二年:潜心修练
第三年:会做些比较关键的代码,大牛比较信任,会将代码交给你写,开始有点飘。
如果大于三年,又是一个境界。
5年另外一个境界
8年则是一个峰会的情景,我想楼主不会,起码还有执着。

如果是一个作坊的话,或者去一个从别的行业进军软件的话,或者是一个非IT公司的话,那楼主工作年限在1年以下。


我能肯定的是LZ 写过的JAVA代码(纯java代码)没有超过2W行. 
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics