Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何限制对对象的访问?_Java - Fatal编程技术网

Java 如何限制对对象的访问?

Java 如何限制对对象的访问?,java,Java,我在大学里也有类似的有趣的任务。例如,有ClassA。我需要限制对对象的访问,如果今天是星期天,客户端无法生成ClassA对象或使用现有的ClassA对象。我想我需要为类做一些包装,因为否则我需要在类A的每个方法中做当天的检查条件。有什么设计图样吗?求你了,我希望你能帮助我 模式将帮助您实现此功能。工厂模式是您需要的。将参数传递给工厂类(“包装器”),它负责创建正确类型的对象。例如: class ClassA implements MyInterface { ... } class ClassB

我在大学里也有类似的有趣的任务。例如,有ClassA。我需要限制对对象的访问,如果今天是星期天,客户端无法生成ClassA对象或使用现有的ClassA对象。我想我需要为类做一些包装,因为否则我需要在类A的每个方法中做当天的检查条件。有什么设计图样吗?求你了,我希望你能帮助我

模式将帮助您实现此功能。

工厂模式是您需要的。将参数传递给工厂类(“包装器”),它负责创建正确类型的对象。例如:

class ClassA implements MyInterface { ... }
class ClassB implements MyInterface { ... }

class MyFactory {
    public MyInterface create(int dayOfTheWeek) {
        if (dayOfTheWeek == 0) {
            return new ClassA();
        } else {
            return new ClassB();
        }
    }
}
当您需要新对象时,MyFactory决定实际的类:

MyFactory factory = new MyFactory();
MyInterface object = factory.create(dayOfTheWeek);
...

由于您需要一个不能使用其他现有ClassA对象的客户机,它可能有助于实现一种动态代理。下面是大致代码:

public class MasterControl {
    public static boolean check(Method m){
        //do controls on the current day
        //return true/false accordingly
    }

}



public class ProxyFactory {
    public static ClassAInterface getListProxy(final ClassA cp){
        return (ClassAInterface) Proxy.newProxyInstance(cp.getClass().getClassLoader(), new Class[] {ClassAInterface.class},new InvocationHandler() {

            @Override
            public Object invoke(Object proxy, Method method, Object[] args)
                    throws Throwable {
                    if(MasterControl.check(method,args[0]))
                        return method.invoke(cp, args);
                    else
                        return (ClassAInterface) null;
            }
        }); 
    }
}

“我的大学里也有类似的有趣的任务。”1)你对“有趣”有一个奇怪的想法。2) 别忘了在家庭作业问题中添加标签。好的,这对制作ClassA的对象很有好处。但我需要知道,如果今天是星期天,所有现有对象都不工作,即客户端无法执行obj.add()、obj.remove()等。您所说的“不工作”是什么意思?什么也不做?抛出异常?您可以实现ClassB,这样它就可以在每次调用时无条件地抛出一个
IllegalStateException
。或者,只要将
isAvailable()
方法添加到ClassA,并在需要调用add或remove时查询它即可。这会好得多。请看我对埃塞尔·艾古诺克的评论,我从作者到第一个答案都读到了我的评论。也许是这样;这并不是完全错误的。Sry,它是从普通工厂开始的