使用Java Runnable进行错误的类设计

使用Java Runnable进行错误的类设计,java,multithreading,thread-safety,runnable,Java,Multithreading,Thread Safety,Runnable,你能解释一下为什么在下面的程序中以这种方式实现Runnable接口是一个糟糕的设计决策吗?直观地说,如果我必须自己编写,我会使Hotel成为自己的类,并在实现Runnable的新类中为run()编写规范。然而,我无法解释为什么下面的代码是一个糟糕的设计决策 这门课模拟了一个有排队等候的人和房间列表的酒店。有几个“办公桌”在不同的线程上运行,每个办公桌负责将人员从队列中移开,并将他们登记到可用的房间。为简单起见,不包括退房。方法的实现并不重要(请相信它是线程安全的),这个问题是关于将run()放入

你能解释一下为什么在下面的程序中以这种方式实现Runnable接口是一个糟糕的设计决策吗?直观地说,如果我必须自己编写,我会使Hotel成为自己的类,并在实现Runnable的新类中为run()编写规范。然而,我无法解释为什么下面的代码是一个糟糕的设计决策

这门课模拟了一个有排队等候的人和房间列表的酒店。有几个“办公桌”在不同的线程上运行,每个办公桌负责将人员从队列中移开,并将他们登记到可用的房间。为简单起见,不包括退房。方法的实现并不重要(请相信它是线程安全的),这个问题是关于将run()放入Hotel类的设计决策

public class Hotel implements Runnable {
    private final static int NR_ROOMS = 10;
    private final Person [] rooms = new Person [ NR_ROOMS ];
    private final List < Person > queue = new ArrayList < >();
    private final Lock queueLock = new ReentrantLock ();

    private boolean occupied (int i) {
        return ( rooms [i] != null);
    }

    private int checkIn ( Person p) {
        // add Person to a free room
    }


    private void enter ( Person p) {
        // add a person to the waiting queue
    }

    // every desk employee should run as a separate thread
    @Override
    public void run () {
        // remove guests from the queue and check them in
    }
}

公共级酒店实现可运行{
私人最终静态室内面积=10间;
私人最终人员[]房间=新人员[n个房间];
私有最终列表queue=newarraylist<>();
private final Lock queueLock=new ReentrantLock();
专用布尔值(int i){
返回(房间[i]!=null);
}
私人整数签入(个人p){
//将人员添加到免费房间
}
私人无效输入(个人p){
//将一个人添加到等待队列中
}
//每个桌面员工都应该作为单独的线程运行
@凌驾
公开作废运行(){
//将客人从队列中移除,并让他们登记入住
}
}

面向对象编程的全部要点是创建建模业务逻辑的类;由于您的问题有一个酒店、房间、人员等,您可以期望在您的问题域中有一些类来表示这些“名词”。然后,这些类上的方法表示使用对象执行的操作

Hotel类上的
run()
方法的直接问题是,对于Hotel“run”来说,根本不清楚它意味着什么。我想这在某些情况下可能是有道理的;例如,如果你做了一个模拟,并且有关于在酒店里随着时间的推移应该发生什么的规则。不自然的是,酒店通常是发生事情的地方,而不是做事情的地方

就这一点而言,对于我来说,酒店的一个实例有一个
房间
的列表似乎过于简单,每个房间都是
Person
类型。您可以通过这种方式使简单的逻辑工作,但OO设计的原则之一是使扩展现有程序变得容易,因为您已经对问题域的真实世界对象进行了建模,因此使用它们做更多的事情自然会比没有建模时更容易。在这种情况下,在我看来,如果酒店有一个房间对象列表,那么每个房间对象可以包含一定数量的Person对象,那么与已知问题空间的匹配会更好。那么一个房间里的人数就更灵活了,不同房间的人数可能会有所不同,等等


我完全赞成从一个简单的系统开始,但既然你问的是OO设计,我想我应该借此机会指出关于这个系统的这些事情。

请发布一个可复制的代码示例。如果你注释掉所有的方法,我不知道代码有什么不好。另外,我不知道主类是如何将这个runnable添加为线程的。将数据类、业务逻辑和多线程混合在一个地方不是一个好主意。