Techincally我知道为什么类需要实现serializable.原因是ObjectOutputStream的writeObject方法在写入对象状态之前在内部检查"serializable的实例".
但我的问题是需要什么呢?writeObject方法可以简单地写对象状态是否对象(其状态需要写入)是否实现可序列化?
根据wiki,类实现此接口以指示其非瞬态数据成员可以写入ObjectOutputStream.但问题是为什么类需要实现可序列化以确定字段是否是瞬态的.即使是不实现可序列化的类也应该被序列化(标记为瞬态的字段除外).
将对象标记为可序列化(带有接口)并不能神奇地使该对象可序列化,它一直是可序列化的,只是现在你表达了系统可以自己找到的东西,所以我看不出真正的理由.序列化是现在的方式.
为什么类需要实现序列化标记接口来序列化类?
由于标记接口主要用于标记类,因此可以通过注释实现相同的功能.例如,Cloneable界面可以@Cloneable.
那么仍然需要标记接口或者可以通过Annotations重新定位吗?使用其中任何一个有什么优点/缺点吗?我的意思是比其他人更喜欢?
我发现自己经常遇到以下问题.我有一些标记接口(为了简单起见,我们使用java.io.Serializable)和几个包装器(Adapter,Decorator,Proxy,...).但是当你将Serializable实例包装在另一个实例(不可序列化)中时,你会失去功能.java.util.RandomAccess也会出现同样的问题,可以通过List实现来实现.有没有一个很好的OOP方式来处理它?
有人可以解释一下java中标记接口的契约吗?
对于Ex:如果Clonable是没有字段/方法的标记接口,那么clone()定义在哪里?
我们为什么要Clonable在clone()使用时实现i/f ?
好吧,我的问题是,如果clone()是一个java.lang.Object类的方法,为什么要实现Clonablei/f来覆盖clone().
有人可以详细说明这个java的惯例吗?
提前致谢
在练习反思的同时,我SelfComparable Interface在Collections课堂上了解了一下
interface java.util.Collections$SelfComparable
Run Code Online (Sandbox Code Playgroud)
这个界面用于什么?
我已覆盖 Microsoft Identity 提供的默认 IdentityUser 和 UserStore。
public class ApplicationUser<TIdentityKey, TClientKey> : IdentityUser<TIdentityKey>, IApplicationUser<TIdentityKey, TClientKey>
where TIdentityKey : IEquatable<TIdentityKey>
where TClientKey : IEquatable<TClientKey>
{
public TClientKey TenantId { get; set; }
}
public class ApplicationUserStore<TUser, TRole, TIdentityKey, TClientKey> : UserStore<TUser, TRole, IdentityServerDbContext<TIdentityKey, TClientKey>, TIdentityKey>
where TUser : ApplicationUser<TIdentityKey, TClientKey>
where TRole : ApplicationRole<TIdentityKey>
where TIdentityKey : IEquatable<TIdentityKey>
where TClientKey : IEquatable<TClientKey>
{
private readonly IdentityServerDbContext<TIdentityKey, TClientKey> _context;
private readonly ITenantService<TIdentityKey, TClientKey> _tenantService;
public ApplicationUserStore(IdentityServerDbContext<TIdentityKey, TClientKey> context, ITenantService<TIdentityKey, TClientKey> tenantService) : …Run Code Online (Sandbox Code Playgroud) c# dependency-injection marker-interfaces asp.net-identity asp.net-core
我正在开发一个较大的Java类层次结构,其中一些具有我在运行时查询感兴趣的特定属性(该属性绝对仅适用于类,而不是特定实例).
我可以创建一个抽象的布尔方法isFooBar(),子类可以实现它来指示属性是否存在:
public abstract class MyBaseClass {
...
public abstract boolean isFooBar();
}
Run Code Online (Sandbox Code Playgroud)
或者我可以使用标记接口FooBarProperty并对接口进行instanceof检查:
public class MyConcreteClass extends MyBaseClass implements FooBarProperty {
...
}
Run Code Online (Sandbox Code Playgroud)
或者我猜您甚至可以使用AmitD建议的注释:
@FooBarAnnotation
public class MyConcreteClass extends MyBaseClass {
...
}
Run Code Online (Sandbox Code Playgroud)
每种方法的优缺点是什么,通常应该优先考虑哪些方法?
我有三个标记接口,用于流畅的API扩展方法:
interface IOne { }
interface ITwo { }
interface IOneOrTwo : IOne, ITwo { }
Run Code Online (Sandbox Code Playgroud)
以及以下扩展方法:
public static IOneOrTwo Foo (this IOne obj, string arg)
{
// do something with arg
return obj; // <- possible without cast?
}
Run Code Online (Sandbox Code Playgroud)
问题:是否有可能在不进行投射的情况下返回obj?通常,您需要在这种情况下明确地向下转换,但是,这些接口都不要求底层对象具有任何类型的方法/属性/任何方式.
注意:实际的实现类实现了所有接口.
问题2:为什么实现IOne而ITwo不是自动让实现也是类型IOneOrTwo?
在最近的一次采访中,有人问我一个问题:“我们怎么能说java8中的功能接口类似于标记接口”。
我无法回答这个问题。
但是我认为标记甚至没有任何方法,而功能接口必须要覆盖一种方法。
有人可以帮助我理解这是否在某些情况下是有效的论点,或者问题本身是错误的?
java interface marker-interfaces java-8 functional-interface
我已经阅读了有关标记接口的内容,并且对如何在代码中使用它们有了一些了解,但我不明白为什么我们需要它们以及引入这个概念的原因是什么。
我在互联网上搜索,所有的答案都是“他们向 JVM 提供了一些基本信息,以便 JVM 可以执行一些有用的操作”,但问题是为什么 JVM 需要知道这一点以及 JVM 可能执行哪些操作必须执行?为什么我不能只克隆对象而不从 Clonable 扩展类?为什么我不能序列化类对象而不从 Serializable 扩展它?
标记界面没有多大意义,在我看来显然不是一个好的设计。一个没有任何方法的接口???重点是什么?
现在显然在这里使用注释而不是标记接口,但问题仍然是为什么 JVM 需要知道?
Comparable接口是如何标记接口的,即使它定义了一个compareTo()方法?请详细说明.
java ×9
oop ×3
c# ×2
interface ×2
annotations ×1
api-design ×1
asp.net-core ×1
collections ×1
comparable ×1
composition ×1
decorator ×1
generics ×1
java-8 ×1
properties ×1
terminology ×1