小编sli*_*lim的帖子

Java中的多态工厂/ getInstance()

我的目标是创建一组对象,每个对象都有一个唯一的标识符.如果已存在具有该标识符的对象,我想使用现有对象.否则我想创建一个新的.我试图不使用Singleton这个词,因为我知道这是一个肮脏的词......

我可以使用工厂方法:

    // A map of existing nodes, for getInstance.
private static Map<String, MyClass> directory = new HashMap<String, MyClass>();

public static MyClass getInstance(String name) {
    MyClass node = directory.get(name);
    if(node == null) {
       node == new MyClass(name);
    }
    return node;
}
Run Code Online (Sandbox Code Playgroud)

或者同样,我可以有一个单独的MyClassFactory方法.

但我原本打算将MyClass子类化:

public class MySubClass extends MyClass;
Run Code Online (Sandbox Code Playgroud)

如果我不再做,并调用MySubClass.getInstance():

MyClass subclassObj = MySubClass.getInstance("new name");
Run Code Online (Sandbox Code Playgroud)

...然后subclassObj将是一个普通的MyClass,而不是MySubClass.

然而,在每个子类中重写getInstance()似乎很容易.

我缺少一个简洁的解决方案吗?


这是问题的通用版本.更具体,因为回答者要求他们.

该程序用于生成表示软件片段的节点之间的依赖关系的有向图.子类包括Java程序,Web服务,存储的SQL过程,消息驱动的触发器等.

因此,该网络中的每个类都是"is-a"元素,并且具有导航和修改与其他节点的依赖关系的方法.子类之间的区别在于populate()用于从适当的源设置对象的方法的实现.

假设名为'login.java'的节点知道它对'checkpasswd.sqlpl'有依赖性:

this.addDependency( NodeFactory.getInstance("checkpasswd.sqlpl"));
Run Code Online (Sandbox Code Playgroud)

问题是checkpasswd.sqlpl对象此时可能已存在,也可能尚未存在.

java polymorphism design-patterns factory

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

AJAX/getJSON中的jQuery范围或竞争条件

我有一段jQuery代码,可以getJSON()快速连续调用几个调用:

var table = $("table#output");
for (var i in items) {
    var thisItem = items[i];
    $.getJSON("myService", { "itemID": thisItem }, function(json) {
        var str = "<tr>";
        str += "<td>" + thisItem + "</td>";
        str += "<td>" + json.someMember + "</td>";
        str += "</tr>";
        table.append(str);
    });
}
Run Code Online (Sandbox Code Playgroud)

当我针对滞后服务器运行时,表会填充预期json.someMember值(它们按顺序到达:我不介意),但是thisItem列中填充了来自各种迭代的不可预测的值混合.

我假设这与范围和时间有关 - 回调函数是thisItem从更广泛的范围读取?我对吗?我该如何防止这种情况?

我目前的解决方法是让JSON服务返回其输入的副本 - 至少可以说是不满意的.

javascript ajax jquery json timing

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

规范化Java bean属性名称

我有一堆第三方Java类,它们使用不同的属性名称来实现相同的属性:

public class Foo {
   public String getReferenceID();
   public void setReferenceID(String id);
   public String getFilename();
   public void setFilename(String fileName);
}

public class Bar {
   public String getRefID();
   public void setRefID(String id);
   public String getFileName();
   public void setFileName(String fileName);
}
Run Code Online (Sandbox Code Playgroud)

我希望能够以规范化的形式解决这些问题,以便我可以多态地对待它们,以便我可以使用Apache BeanUtils来完成这些工作:

PropertyUtils.copyProperties(object1,object2);
Run Code Online (Sandbox Code Playgroud)

显然,为每个类编写一个适配器是微不足道的......

public class CanonicalizedBar implements CanonicalizedBazBean {
    public String getReferenceID() {
        return this.delegate.getRefID();
    }
    // etc.
}
Run Code Online (Sandbox Code Playgroud)

但我想知道那里有更普遍和动态的东西吗?什么东西需要一对多的属性名称等价映射,以及委托类,并生成适配器?

java javabeans

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

Java如何选择使用哪个构造函数?

我无法理解以下程序的输出.

public class Confusing {

    private Confusing(Object o) {
        System.out.println("Object");
    }

    private Confusing(double[] dArray) {
        System.out.println("double array");
    }

    public static void main(String[] args) {
        new Confusing(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

正确的输出是"双数组".当两个都可以接受null时,这个构造函数被选择为比另一个更具体吗?

java

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

如何测试java-8自定义收集器的标识和关联约束

我已经为Java 8编写了一个自定义收集器.它的聚合器是一个包含一对列表的Map:

    @Override
    public Supplier<Map<Boolean, List<Object>>> supplier() {
        return () -> {
            Map<Boolean, List<Object>> map = new HashMap<>(2);
            map.put(false, new ArrayList<>());
            map.put(true, new ArrayList<>());
            return map;
        };
    }
Run Code Online (Sandbox Code Playgroud)

所以我认为它的组合是这样的:

    @Override
    public BinaryOperator<Map<Boolean, List<Object>>> combiner() {
        return (a, b) -> {
            a.get(false).addAll(b.get(false));
            a.get(true).addAll(b.get(true));
            return a;
        };
    }
Run Code Online (Sandbox Code Playgroud)

我想测试收集器以确保它是否以及何时并行处理流,结果是正确的.

我怎样才能编写一个单元测试呢?

当然我可以写一个combiner直接调用的测试,但这不是我想要的.我希望证据在收集的背景下起作用.

Javadoc Collector说:

为确保顺序和并行执行产生相同的结果,收集器函数必须满足标识和关联约束.

我可以通过测试这些约束来获得对收集器的信心吗?怎么样?

java java-stream

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

黄瓜junit runner java.lang.NoSuchMethodError:

试图实施黄瓜做一些自动化测试.jUnit测试.我创建了2个文件并编辑了maven项目附带的pom.xml来添加依赖项.内容如下所示.两个文件中的第一个是黄瓜.feature文件,它是简单语言的小黄瓜.另一个是CukesRunner.java

当我使用Project -> Run as ... -> Maven test它运行我的测试它按预期工作.

但是,当我使用Eclipse Eclipse JUnit GUI运行CukesRunner.java文件时,出现错误:

java.lang.NoSuchMethodError: org.junit.runner.Description.createSuiteDescription(Ljava/lang/String;Ljava/io/Serializable;[Ljava/lang/annotation/Annotation;)Lorg/junit/runner/Description;
    at cucumber.runtime.junit.FeatureRunner.getDescription(FeatureRunner.java:43)
    at cucumber.api.junit.Cucumber.describeChild(Cucumber.java:77)
    at cucumber.api.junit.Cucumber.describeChild(Cucumber.java:41)
    at org.junit.runners.ParentRunner.getDescription(ParentRunner.java:226)
    ... 
Run Code Online (Sandbox Code Playgroud)

pom.xml中:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.bdd</groupId>
  <artifactId>airportparking</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>airportparking</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-java</artifactId>
            <version>1.1.5</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-junit</artifactId>
            <version>1.1.5</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.rubiconproject.oss</groupId>
            <artifactId>jchronic</artifactId>
            <version>0.2.6</version>
            <scope>test</scope>
        </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.8.2</version>
        <scope>test</scope>
    </dependency>
  </dependencies>
</project>
Run Code Online (Sandbox Code Playgroud)


CukesRunner.java:

package com.bdd.airportparking;

import cucumber.api.junit.*;
import org.junit.runner.RunWith;

@RunWith(Cucumber.class)
@Cucumber.Options(
        format={"pretty", "html:target/cucumber"}, …
Run Code Online (Sandbox Code Playgroud)

java junit cucumber maven cucumber-jvm

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

HP Fortify - 注释方法参数

我正在尝试消除Java应用程序的HP Fortify扫描中的误报.

此方法导致"隐私冲突"问题(PrintWriter是一个servlet响应)

 private void writeOutput(String passwordRules, PrintWriter out) {
      ...
      out.print(passwordRules);
      ...
 }
Run Code Online (Sandbox Code Playgroud)

这是因为Fortify遵循命名约定,以决定passwordRules包含私有数据.但我passwordRules不是私人数据 - 它包含"最少8个字符"之类的内容.

我可以通过更改变量的名称来消除错误.但是原则上我不想为了源代码分析器的好处而牺牲我的代码的可读性.

我希望这能解决它:

 private void writeOutput(@FortifyNotPassword String passwordRules, PrintWriter out) ...
Run Code Online (Sandbox Code Playgroud)

但是,似乎注释不是为该上下文编写的:

 The annotation @FortifyNotPassword is disallowed for this location.
Run Code Online (Sandbox Code Playgroud)

我试过了:

 private void writeOutput(String passwordRules, PrintWriter out) {
      ...
      @FortifyNotPassword String rules = passwordRules;
      out.print(rules);
      ...
 }
Run Code Online (Sandbox Code Playgroud)

......但这并没有消除假阳性.(它违反了我不使代码不易读的原则).

我也尝试了上面的@FortifyNotPrivate,结果相同.

那么这样做的正确方法是什么?

java fortify

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

是否有比单元素数组更好的引用容器?

如果该变量是final,则Java匿名类只能从周围方法访问变量,因此内部类不能写入该变量.为了捕获由封闭类型创建的对象,我创建了一个final单元素数组作为引用:

    final String[] ref = new String[1];
    final Runnable runnable = new Runnable() {
        public void run() {
            ref[0] = "Hello world";
        }
    };

    runnable.run();
    System.out.println(ref[0]);
Run Code Online (Sandbox Code Playgroud)

这似乎有效,我想有很好的表现.但它感觉有点hacky.

显然,编写一个Ref类来替换它是很简单的:

    final Ref<String> ref = new Ref<>();
    final Runnable runnable = new Runnable() {
        public void run() {
            ref.set("Hello world");
        }
    };

    runnable.run();
    System.out.println(ref.get());
Run Code Online (Sandbox Code Playgroud)

...标准Java运行时中是否有现有的类来执行此操作?

我看过了java.lang.ref.Reference,这不是一回事.这些是不可变的,唯一的实现是弱/幻像引用.

java

7
推荐指数
2
解决办法
1846
查看次数

过滤node.js中的Stream对象

在我看来,在Node.js中处理某些类型数据的优雅方法是链接处理对象,如UNIX管道.

例如,grep:

function Grep(pattern) {
    ...
}
util.inherits(Grep, stream.Stream);

Grep.prototype.???? = ???????  // What goes here?

grep = new Grep(/foo/);

process.stdin.pipe(grep);
myStream.pipe(process.stdout);
Run Code Online (Sandbox Code Playgroud)

然而,我并不清楚为什么需要重写各种Stream方法才能使其工作.

如何创建简单地从其输入复制到其输出的Stream对象?据推测,更复杂的过滤流变得微不足道.

更新:感觉好像以下应该有效(用CoffeeScript表示,所以我不用JS语法填充这个框!):

class Forwarder extends stream.Stream
    write: (chunk, encoding) ->
        @emit 'data', chunk
    end: (chunk, encoding) =>
        if chunk?
            @emit 'data', chunk
        @emit 'end'

fwd = new Forwarder()
fwd.pipe(process.stdout);
process.stdin.pipe(fwd);
process.stdin.resume();
Run Code Online (Sandbox Code Playgroud)

但是,在此脚本中捕获内容不会输出任何内容.在脚本中显式调用'fwd.write()'会导致stdout输出.

streaming javascript-events node.js

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

iText PDF中的Unicode字符

我需要iText的帮助我看一些谷歌的结果和一些在这里,但没有找到任何适合我的东西.我需要在我的pdf中使用波兰字符,但我什么都没有.如果需要在评论中写下其他内容,我认为这是一个很重要的代码:

private static Font bigFont = new Font(Font.FontFamily.HELVETICA, 18, Font.BOLD);
Run Code Online (Sandbox Code Playgroud)

另一个

Paragraph par = new Paragraph(?abadzak, bigFont);
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我该怎么做才能使这个Ł在pdf和其他波兰人角色中可见

更新 我资助这个,但不知道如何使用它作为我的项目 波兰字符在itext PDF中

java swing itext special-characters

6
推荐指数
2
解决办法
8881
查看次数