我有一个定义不可变值类型的类,我现在需要序列化.不变性来自构造函数中设置的最终字段.我已经尝试过序列化,它的确有效(令人惊讶的是?) - 但我不知道如何.
这是该课程的一个例子
public class MyValueType implements Serializable
{
private final int value;
private transient int derivedValue;
public MyValueType(int value)
{
this.value = value;
this.derivedValue = derivedValue(value);
}
// getters etc...
}
Run Code Online (Sandbox Code Playgroud)
鉴于该类没有没有arg构造函数,它如何实例化并设置最终字段?
(旁边 - 我注意到这个类特别是因为IDEA没有为这个类生成"no serialVersionUID"检查警告,但是成功地为我刚刚可序列化的其他类生成了警告.)
是否有一个提供发布/订阅模式的java的轻量级框架?
一些理想的功能
我知道JMS,但这对我的需求来说太过分了.发布/订阅数据是扫描文件系统的结果,扫描结果被送到另一个组件进行处理,然后在被送到另一个组件之前进行处理,依此类推.
编辑:所有在同一过程中.来自beans的PropertyChangeListener并没有完全削减它,因为它报告了属性的变化,而不是发布特定的项目.我可以通过拥有"最后发布的对象"属性以及已发布的对象来使用工作模式来使用ProprtyChangeListener.PropertyChangeListeners不支持泛型,并且在属性更改语义中是根深蒂固的,而不是纯粹的发布/订阅.java.util Observer/Observable模式会很好,但是Oberver是一个具体的类.
有效的java说:
//潜在的安全漏洞!
static public final Thing [] VALUES = {...};
谁能告诉我什么是安全漏洞?
在-able结尾的接口java的形容词Serializable,Comparable等等......那么,为什么是Throwable一类?如果Throwable是接口,异常处理会不会更容易?(编辑:例如,异常类不需要扩展Exception/RuntimeException.)
显然,现在改变它是不可能的.但它可以抽象吗?这不会避免不良做法throw new Throwable();
给定一个通用接口
interface DomainObjectDAO<T>
{
T newInstance();
add(T t);
remove(T t);
T findById(int id);
// etc...
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个指定type参数的子接口:
interface CustomerDAO extends DomainObjectDAO<Customer>
{
// customer-specific queries - incidental.
}
Run Code Online (Sandbox Code Playgroud)
实现需要知道实际的模板参数类型,但是当然类型擦除手段在运行时不可用.我可以包含一些注释来声明接口类型吗?就像是
@GenericParameter(Customer.class)
interface CustomerDAO extends DomainObjectDAO<Customer>
{
}
Run Code Online (Sandbox Code Playgroud)
然后,实现可以从接口获取此批注,并将其用作运行时泛型类型访问的替代.
一些背景:
此接口使用JDK动态代理为实现概述这里.这个接口的非泛型版本运行良好,但使用泛型更好,而不必在子接口中创建方法只是为了指定域对象类型.泛型和代理处理大多数事情,但在运行时需要实际类型来实现该newInstance方法等.
我已经阅读了关于继承bean定义的Spring 3参考,但我对可能和不可能的内容感到困惑.
例如,一个带有协作者bean的bean,配置值为12
<bean name="beanService12" class="SomeSevice">
<constructor-arg index="0" ref="serviceCollaborator1"/>
</bean>
<bean name="serviceCollaborator1" class="SomeCollaborator">
<constructor-arg index="0" value="12"/>
<!-- more cargs, more beans, more flavor -->
</bean>
Run Code Online (Sandbox Code Playgroud)
然后,我希望能够创建类似的bean,配置略有不同的协作者.我能做点什么吗
<bean name="beanService13" parent="beanService12">
<constructor-arg index="0">
<bean>
<constructor-arg index="0" value="13"/>
</bean>
</constructor>
</bean>
Run Code Online (Sandbox Code Playgroud)
我不确定这是否可能,如果是的话,感觉有点笨拙.是否有更好的方法来覆盖大型嵌套bean定义的小部分?似乎子bean必须非常了解父类,例如构造函数索引.
这是一个玩具示例 - 实际上,服务是依赖于许多其他协作者bean的大型bean定义,这些bean还具有其他bean依赖性.例如,创建了一系列处理程序,每个bean引用链中的下一个,引用下一个.我想创建一个几乎完全相同的链,中间的处理程序有一些小的变化,我该怎么做?
我不想改变结构 - 服务bean使用协作者来执行他们的功能,但我可以添加属性并使用属性注入,如果这有帮助的话.
这是一个重复的模式,会创建自定义架构帮助吗?
谢谢你的建议!
编辑:我的问题的核心是,如果我有一个非常大的bean定义,创建一个复杂的bean的bean(bean有正确的bean等),我想创建一个几乎相同的bean一些变化,我该怎么做?如果您的解决方案必须使用适当的,或者可以使用构造函数注入,请提及.
嵌套与顶级bean不是问题(事实上,我认为所有bean都是实践中的顶级bean.)
EDIT2:到目前为止,感谢您的回答.FactoryBean可能就是答案,因为这会降低spring上下文的复杂性,并允许我仅将差异指定为工厂的参数.但是,将一大块上下文推回到代码中并不合适.我听说spring可以和脚本一起使用,比如groovy - 那提供了另一种选择吗?工厂可以在groovy中创建吗?
为什么java.lang.Object有两种通知方法 - notify和notifyAll?似乎notifyAll至少一切都notify做了,所以为什么不一直使用notifyAll?如果notifyAll用来代替notify,程序是否仍然正确,反之亦然?是什么影响了这两种方法之间的选择?
我是Java编程语言的新手,所以这可能是一个愚蠢的问题,但我不得不问它,因为我无法自己弄明白.这是交易.
我想创建从列表中提取某些对象类型的方法.因此该方法应该接收List作为参数,意味着list应该包含Object1或Object2.我试过这样的:
public Object1 extractObject(List<Object>){
//some pseudo-code
... loop trough list and check if list item is instance of object one return that instance
}
Run Code Online (Sandbox Code Playgroud)
使用List<?>as方法参数声明方法的问题是我从eclipse收到编译错误Syntax error on token ">", VariableDeclaratorId expected after this token.
如何正确设置方法签名以接受Object1或Object2的对象类型?谢谢
这是我的代码:
protected Object1 getObject1(List<Object> list){
for(Object obj : list) {
if(obj instanceof Object1) {
return (Object1) obj;
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
编辑 - 这两者之间有什么区别:
public Object1 getObject1(List<Object> list){
for(Object obj : list) {
if(obj instanceof Object1) {
return (Object1) …Run Code Online (Sandbox Code Playgroud) 我想为我的应用程序进行集成测试和系统测试,但是产生良好的集成和系统测试通常需要我付出很多努力,而我并没有费心.我尝试了几次,我编写了定制的,特定于应用的测试线束,这种感觉就像每次重新发明轮子一样.我想知道这是不是错误的做法.是否存在集成和完整系统测试的"标准"方法?
编辑:澄清,它是桌面和Web应用程序的自动化测试.理想情况下,它是一个完整的测试套件,可以运行应用程序的全部功
java ×9
generics ×2
annotations ×1
class-design ×1
collections ×1
concurrency ×1
final ×1
frameworks ×1
spring ×1