在网络编程中,您需要具有多个层次深度的状态机.
State Machine 1
State Machine 2
State Machine 3
State Machine 4
Run Code Online (Sandbox Code Playgroud)
这里State Machine 1包含两个状态机2和3.3还包含一台机器4.
根据外部机器的状态,消息应该通过内部状态机.此外,如果内部状态机存在某些错误,则应将反馈给予上位机.
有一个很好的方法来做到这一点?
现在我有一个if语句和旗帜的丛林,为我这样做.我一直面临着一些问题,即由于状态机的整个状态处于不可恢复的状态而未设置某个标志.
更新: 我试图保持状态和机器静止.当请求将通过机器和状态时,请求本身将存储所需的所有元数据.在这种情况下,正常的状态机模式没有帮助.
由于标记接口主要用于标记类,因此可以通过注释实现相同的功能.例如,Cloneable界面可以@Cloneable.
那么仍然需要标记接口或者可以通过Annotations重新定位吗?使用其中任何一个有什么优点/缺点吗?我的意思是比其他人更喜欢?
假设我们有一个班级:
class Class1
{
int i = 1;
}
Run Code Online (Sandbox Code Playgroud)
我们有一个变量:
Class1 ob1 = new Class1();
Run Code Online (Sandbox Code Playgroud)
ob1存储了它引用的对象的信息Class1? Class1存储堆的哪一部分是否存储了Class1类型的信息? 如果您可以推荐这些信息的来源,我将非常感谢提供它,我在参考书中找不到它.
假设在我的代码中某处我写了一个空synchronized块:
synchronized(obj){
//No code here
}
Run Code Online (Sandbox Code Playgroud)
因为同步块不包含任何代码,JIT编译器obj是否会通过不锁定来优化它,因为它没有用?
Java编译器做类似的技巧,如Lock粗化,但是这个同步块也会被优化掉吗?
编辑:
根据assylias的观点,
synchronized(new Object()){
//empty block
}
Run Code Online (Sandbox Code Playgroud)
JIT编译器现在能够优化它,因为我使用的是一个不会逃避我的方法的Object吗?
这是Java 8中::(双冒号)运算符的后续问题,其中Java允许您使用::运算符引用方法.
是否可以提供我创建的一些自定义功能接口并将其与::运营商一起使用?怎么做?
我目前正在尝试将我们的构建从手动过程(MyEclipse/export as war)更改为自动Maven Build.
由MyEclipse构建的war应用程序在我们的Tomcat 7.0.29安装(Windows 7)上部署并运行正常.在MyEclipse构建路径中,我们配置了一个用户库(tomcat),其中包含来自的所有jar $CATALINA_HOME/lib.
我们有一些使用javax.servlet.http.*classes(HttpSessionEvent等)的servlet监听器和过滤器.它们是打包的WEB-INF\classes\com\mycompany\filters
在部署由Maven构建的战争时,我NoClassDefFoundError上了HttpSessionEvent课.我用-verbose:class JVM选项进行了跟踪,我看到最后加载的类是我的c:\apache\webapps\myapp\WEB-INF\classes\com\mycompany\filters目录过滤器
.然后我尝试加载/查找HttpSessionEvent并且无法执行此操作.
这servlet-api.jar当然是在我的$CATALINA_HOME\lib目录中.
在我的pom.xml中,我有这种依赖
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>7.0.29</version>
<scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我的路径/类路径中的任何地方都没有其他servlet-api.jar文件(双重检查我的jdk和jre的lib/ext和endorsed目录)
我的maven依赖:树看起来像这样:
[INFO] +- log4j:log4j:jar:1.2.15:compile
[INFO] | \- javax.mail:mail:jar:1.4:compile
[INFO] +- jstl:jstl:jar:1.2:compile
[INFO] +- org.jdom:jdom:jar:1.1:provided
[INFO] +- com.sun.xml.rpc:jaxrpc-impl:jar:1.1.3_01:provided
[INFO] | +- javax.xml:jaxrpc-api:jar:1.1:provided
[INFO] | +- com.sun.xml.messaging.saaj:saaj-impl:jar:1.3:provided
[INFO] | | \- javax.xml.soap:saaj-api:jar:1.3:provided
[INFO] | +- com.sun.xml.rpc:jaxrpc-spi:jar:1.1.3_01:provided
[INFO] | \- com.sun.xml.fastinfoset:FastInfoset:jar:1.0.2:provided
[INFO] +- org.apache.lucene:lucene-core:jar:3.6.0:compile
[INFO] +- org.springframework:spring-context:jar:3.1.0.RELEASE:compile
[INFO] | +- …Run Code Online (Sandbox Code Playgroud) 我有一个带有三个泛型类型参数的类。我想知道这样做是否很好。我的意思是认为这是设计气味?假设某个类的泛型数量甚至更多呢?
class InnerStateMachine<ST extends Enum<?>,EV extends Enum<?>,PEV extends Enum<?>>{
}
Run Code Online (Sandbox Code Playgroud)
哪里
ST -内部状态机的状态
EV -是内部状态机的事件
PEV -是我用于状态机之间通信的父状态机的事件
更新:内部状态机包含在另一个状态机中,该状态机是父级。因此,如果内部状态机想要在父级上触发某个事件,则它会使用PEV父级用来执行某种转换并更改其状态并执行某些操作的事件之一来触发。
Memento设计模式用于将对象还原到先前的状态,例如撤消。但是我们可以多次撤消和重做。我已经阅读了多次文章,但是我还是不清楚它们是否相似或相辅相成,可以一起使用。
State模式可以与Memento Design模式相关或一起使用吗?
我的代码转到最后一个arraylist:
if (listItem.get(listItem.size() - 1).SortNo > 0) {
while (listItem.get(0).SortNo == 0) {
DTO_NightClinic dt = listItem.get(0);
listItem.remove(0);
listItem.add(dt);
}
}
Run Code Online (Sandbox Code Playgroud)
但通常listItem.remove(0);不起作用.第一项仍然存在于arraylist的第一个位置.
我是函数式编程的新手,我正在尝试使用 Java 中的 Lambda 功能来尝试执行 FP。我知道 Java 不是学习 Functional 的好选择,但在我的办公室里,我只能使用 Java,并且很想在那里应用其中的一些原则。
我在 Java 中创建了一个 Optional monad 类型的东西,它看起来像这样:
public abstract class Optional<T> implements Monad<T> {
//unit function
public static <T> Optional<T> of(T value) {
return value != null ? new Present<T>(value) : Absent.<T>instance();
}
@Override
public <V> Monad<V> flatMap(Function<T, Monad<V>> function) {
return isPresent() ? function.apply(get()) : Absent.<V>instance();
}
}
Run Code Online (Sandbox Code Playgroud)
我使用它来避免null代码中的嵌套检查,我使用它的典型用例是当我需要类似firstNonNull.
用:
String value = Optional.<String>of(null)
.or(Optional.<String>of(null)) //call it some reference
.or(Optional.of("Hello")) //other reference
.flatMap(s -> { …Run Code Online (Sandbox Code Playgroud)