小编AFP*_*555的帖子

对访问者设计模式感到困惑

所以,我只是在阅读访问者模式,我发现访问者和元素之间的来回非常奇怪!

基本上我们称之为元素,我们将其传递给访问者,然后元素将自身传递给访问者。然后访问者操作元素。什么?为什么?感觉太没必要了。我称之为“来回疯狂”。

因此,当需要在所有元素上实施相同的操作时,访问者的意图是将元素与其操作分离。这样做是为了防止我们需要用新动作扩展我们的元素,我们不想进入所有这些类并修改已经稳定的代码。所以我们在这里遵循开放/封闭原则。

为什么会有这一切来回,如果我们没有这些,我们会失去什么?

例如,我编写的这段代码记住了这个目的,但跳过了访问者模式的疯狂交互。基本上我有会跳跃和进食的动物。我想将这些动作与对象分离,所以我将动作移到了访客。吃和跳会增加动物的健康(我知道,这是一个非常愚蠢的例子......)

public interface AnimalAction { // Abstract Visitor
    public void visit(Dog dog);
    public void visit(Cat cat);
}

public class EatVisitor implements AnimalAction { // ConcreteVisitor
    @Override
    public void visit(Dog dog) {
        // Eating increases the dog health by 100
        dog.increaseHealth(100);
    }

    @Override
    public void visit(Cat cat) {
        // Eating increases the cat health by 50
        cat.increaseHealth(50);
    }
}

public class JumpVisitor implements AnimalAction { // ConcreteVisitor
    public void visit(Dog dog) {
        // Jumping increases the dog …
Run Code Online (Sandbox Code Playgroud)

java design-patterns visitor visitor-pattern

38
推荐指数
3
解决办法
3776
查看次数

Leaflet中的标记或点的大数据集

我想在传单地图上渲染大约10.000个标记或点.我已经按常规方式做了,我发现它比Google地图慢一些.我正在寻找一种方法来渲染多个元素而不会出现性能问题.

有没有办法用Leaflet做到这一点?

更新:我不想用无法处理事件的亮点绘图.我想用不同的颜色和事件绘制标记.

markers leaflet

19
推荐指数
4
解决办法
2万
查看次数

在Jenkins管道上缓存NPM依赖项

我们都知道,使用npm下载依赖项会非常耗时,尤其是当我们仅限于旧的npm版本时。

对我而言,作为开发人员,这没什么大不了的,因为我不得不在本地开发计算机上执行几次此操作,并且一切都与我项目文件夹中的node_modules缓存一起使用。但是现在我想通过Jenkins将这些应用程序带到CI环境。

我意识到用npm下载依赖项花费了大量时间。这是一个问题,因为:

  1. npm将依赖项下载到项目文件夹中,而不是Maven的/home/user/.m2之类的全局文件夹中

  2. 我必须在每次运行中清理Jenkins工作区文件夹,以避免git checkout出现问题。

我想要一个非常优雅的解决方案来在我的Jenkins从属服务器上缓存npm依赖项,但是到目前为止,我只能想到:

  1. 从Jenkins工作区中删除除node_modules文件夹之外的所有内容。我不喜欢这样,因为如果我继续为我的项目创建分支,我可能会消耗大量的HDD。每个分支都创建一个工作区。

  2. cp ./node_modules /home/npm_cache在每次npm安装之后,然后cp /home/npm_cache ./node_modules在代码签出之后执行类似的操作。

我觉得这些解决方案很糟糕。必须有更好的方法来做到这一点。

dependencies caching node.js jenkins

7
推荐指数
3
解决办法
3862
查看次数

如果数据库发生变化如何更新 Hibernate

例如,我创建了 hibernate.cfg.xml 并自动生成了类(hbm.xml)。

如果我意识到需要从数据库中修改、添加或删除某些内容,通常我必须手动更改数据库,然后也手动更改 hbm.xml 的源代码。

有没有一种方法可以更新而不需要删除代码并重新生成或手动修改代码?

编辑:我的意思是直接更改数据库并反映 Java 代码中的这些更改。抱歉,我不太清楚,因为我不知道还有另一种方法。

java database hibernate

5
推荐指数
1
解决办法
1万
查看次数

将ArrayList <SuperClass>转换为ArrayList <SubClass>

我知道这听起来很愚蠢,但我确实需要它.我100%肯定只允许SubClass进入arraylist.Superlalass中没有其他子类属于该arraylist.

我怎样才能做到这一点?

    Map<String, List<Nodo>> map = ((Cast to ArrayList<NodoMoore> here)nodos).stream().
collect(Collectors.groupingBy(Nodo::getSalida));
Run Code Online (Sandbox Code Playgroud)

我的类实现了一个让我使用Nodo而不是NodoMoore的接口,但是getSalida方法不是Nodo方法,只是NodoMoore方法.

java inheritance arraylist

3
推荐指数
2
解决办法
487
查看次数

何时刷新并清除提交?

我正在将JPA EclipseLink 2.0与Glassfish 3.1.2.2一起使用

我想知道我打电话后是否

em.flush() 
em.clear()
Run Code Online (Sandbox Code Playgroud)

这些对象立即提交到数据库。我的问题是我要进行很多交易OutOfMemory。我想通过刷新事务对象来避免这种情况。

刷新并清除后,我看不到任何直接实体已提交到数据库,只有在整个过程完成后才能看到它们,这告诉我这实际上没有提交。

如果刷新和清除没有提交:

1)它实际上是做什么的?

2)为什么我不再获得OutOfMemory?

请告诉我我是否正确:

我的RAM中分配的对象已发送到数据库,但是更改尚未提交。这仅意味着我清除了RAM,这些对象现在位于DB服务器中,但尚未提交事务。

jpa transactions jta eclipselink jpa-2.0

3
推荐指数
1
解决办法
4495
查看次数

如何在Java中停止Thread

我一直在学习线程,是的...我是一个noobie.我有一个问题,我不知道如何停止线程,因为方法.spot()已被弃用.我想知道如何安全地停止一个线程.我这样做了:

public class Principal{

    private boolean bo1;
    private Thread tr1;


    public Principal(){

        bo1 = true;
        tr1 = new Thread(){
            public void run(){
                while(bo1){
                    //What the Thread does goes here, its a chronometer.
                }          
            }
        };  // The thread body stops here.
    }   // The constructor body stops here. 

    public void changeBo1(){
        if(bo1 == true){
            bo1 = false;
        }

        else{
            bo1 = true;
        }    
    } //Change bo1 ends here.
} //Class ends here.
Run Code Online (Sandbox Code Playgroud)

所以我正在为自己做一个迷你游戏,而我的方法体是一个计时器,它向我展示了我需要多长时间来解决这个难题.这笔交易是,当我开始新游戏时,我调用重置秒,分钟和小时值以及changeBo1()的方法,以便时钟停止.然后,当我在屏幕上第一次点击时,时钟开始.然后,当我改变游戏时.但线程没有读取布尔值的变化,它重新开始到0:00:00,没有我点击屏幕,继续到0:00:01 ---(这不会发生在第一个游戏,因为变量是需要的,当我点击"新游戏"时,当变量需要改变时,就会发生变化.

如何让线程读取boolean bo1的变化?

java multithreading

1
推荐指数
2
解决办法
471
查看次数

“不要通过通道移动数据,而是通过通道移动数据的所有权”的含义

我了解到 Golang 通道实际上比该语言提供的许多替代方案慢。当然,它们确实很容易掌握,但由于它们是高级结构,因此会带来一些开销。

阅读了一些有关它的文章,我发现有人在这里对渠道进行基准测试。他基本上说通道可以传输 10 MB/s,这当然必须取决于他的硬件。然后他说了一些我没完全听懂的话:

如果您只想使用通道快速移动数据,那么一次移动 1 个字节是不明智的。您对通道真正要做的就是移动数据的所有权,在这种情况下,数据速率实际上可以是无限的,具体取决于您传输的数据块的大小。

我在几个地方看到过这种“移动数据所有权”,但我还没有看到一个可靠的例子来说明如何做到这一点,而不是移动数据本身。

我想看一个例子来理解这个最佳实践。

go

1
推荐指数
1
解决办法
635
查看次数

Maven 安装 - 编译错误

我正在尝试清理/安装 Maven,但这就是我安装时发生的情况:

...
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent!
[INFO] Compiling 53 source files to C:\demoBancoWeb\target\classes
[INFO] /C:/demoBancoWeb/src/main/java/co/edu/icesi/demo/dao/ConsignacionesDAO.java: Some input files use unchecked or unsafe operations.
[INFO] /C:/demoBancoWeb/src/main/java/co/edu/icesi/demo/dao/ConsignacionesDAO.java: Recompile with -Xlint:unchecked for details.
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /C:/demoBancoWeb/src/main/java/co/edu/icesi/demo/servlet/ControlCliente.java:[4,21] package javax.servlet does not exist
[ERROR] /C:/demoBancoWeb/src/main/java/co/edu/icesi/demo/servlet/ControlCliente.java:[5,21] package javax.servlet does not exist
[ERROR] /C:/demoBancoWeb/src/main/java/co/edu/icesi/demo/servlet/ControlCliente.java:[6,32] package javax.servlet.annotation does not exist
[ERROR] …
Run Code Online (Sandbox Code Playgroud)

maven

0
推荐指数
1
解决办法
3369
查看次数