Tag: 标记接口

使用标记接口而不是属性的令人信服的理由

在Stack Overflow之前我们已经讨论过 ,我们应该更喜欢属性到标记接口 (没有任何成员的接口)。 MSDN上的界面devise文章也强调了这个build议: 避免使用标记界面(没有成员的界面)。 自定义属性提供了一种标记types的方法。 有关自定义属性的更多信息,请参阅编写自定义属性。 自定义属性是首选的时候,你可以推迟检查的属性,直到代码执行。 如果你的情况需要编译时间检查,你不能遵守这个准则。 甚至有一个FxCop规则来执行这个build议: 避免空接口 接口定义提供行为或使用合同的成员。 接口所描述的function可以被任何types所采用,而不pipetypes在inheritance层次中出现的位置。 一个types通过为接口的成员提供实现来实现一个接口。 一个空的接口没有定义任何成员,因此,没有定义一个可以实现的合同。 如果您的devise包含types预期要实现的空接口,那么您可能使用接口作为标记,或者识别一组types。 如果此标识在运行时发生,则正确的方法是使用自定义属性。 使用属性的存在或不存在或属性的属性来标识目标types。 如果标识必须在编译时发生,那么使用空的接口是可以接受的。 本文只说明一个原因,您可能会忽略该警告:当您需要types的编译时间标识。 (这与界面devise文章一致)。 如果在编译时使用接口来标识一组types,那么从这个规则中排除警告是安全的。 下面是实际的问题:微软在框架类库的devise(至less在几个情况下)不符合他们自己的build议: IRequiresSessionState接口和IReadOnlySessionState接口 。 ASP.NET框架使用这些接口来检查是否应该为特定处理程序启用会话状态。 显然,它不用于types的编译时识别。 为什么他们不这样做? 我可以想到两个潜在的原因: 微优化:检查一个对象是否实现了一个接口( obj is IReadOnlySessionState )比使用reflection检查一个属性( type.IsDefined(typeof(SessionStateAttribute), true) )要快。 大部分时间差别可以忽略不计,但对于ASP.NET运行时中性能至关重要的代码path来说,这可能是非常重要的。 但是,他们可能使用的解决方法就像caching每个处理程序types的结果。 有趣的是,ASMX Web服务(具有类似的性能特征)实际上使用WebMethod属性的EnableSession属性来达到此目的。 实现接口的可能性比用第三方.NET语言装饰属性的types更有可能被支持。 由于ASP.NET被devise为与语言无关,并且ASP.NET根据<%@ Page %> EnableSessionState <%@ Page %>指令 ,使用接口而不是属性可能更有意义。 什么是使用标记接口而不是属性的说服力的原因? 这只是一个(过早的)优化或框架devise中的一个小错误? (他们认为reflection是“红眼睛的大怪物”吗?)思考?

Java中的标记接口?

我被告知,Java中的Marker接口是一个空的接口,用于向编译器或JVM发出信号,告知实现此接口的类的对象必须以特殊方式处理,如序列化,克隆等。 但最近我了解到,它实际上与编译器或JVM无关。 例如,在Serializable接口的情况下, ObjectOutputStream writeObject(Object)方法可以像instanceOf Serializable那样检测类是否实现了Serializable并相应地抛出NotSerializableExceptionexception。 一切都在代码中处理,这似乎是一个devise模式,所以我认为我们可以定义我们自己的标记接口。 现在我怀疑: 上面第一点提到的标记界面的定义是错误的吗? 那么我们怎样才能定义一个标记界面呢? 而不是使用instanceOf操作符为什么不能像writeObject(Serializable)这样的东西,所以有一个编译时types检查,而不是运行时? 注释如何比标记界面更好?

Java中标记接口的用法是什么?

当没有什么东西在像Serializable这样的标记接口中实现的时候。 。 它有什么用处呢?