小编McG*_*one的帖子

Checkstyle"方法未设计为扩展"错误被错误地发出?

我正在使用Checkstyle,并且收到有关此方法的错误:

public final String getAdmitCodeStatus() {
    return admitCodeStatus;
}
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

方法'getAdmitCodeStatus'不是为扩展而设计的 - 需要是abstract,final或empty.

该方法如何不符合要求?有什么我做错了,Checkstyle会对我这个方法咆哮吗?

java checkstyle

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

使用maven-assembly-plugin创建两个可执行的jar

我有一个Maven项目,我想从中创建两个可执行的jar文件.一个将由用户以交互方式使用,另一个将作为预定作业运行,该作业读取前者生成的日志文件.最后,我希望除了MANIFEST.MF文件中的Main-Class属性之外,两个jar文件是相同的.

我正在使用maven-antrun-plugin创建一个可执行jar,这似乎工作正常,直到我尝试通过引入Maven配置文件创建第二个jar文件.我的POM文件的相关部分如下所示:

<profiles>
    <profile>
        <id>publisher</id>
        <build>
            <finalName>${project.artifactId}</finalName>
            <plugins>
                ...
                <plugin>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>2.4</version>
                    <configuration>
                        <appendAssemblyId>false</appendAssemblyId>
                        <finalName>${project.artifactId}</finalName>
                        <archive>
                            <manifest>
                                <mainClass>fully.qualified.path.Publisher</mainClass>
                            </manifest>
                        </archive>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                    </configuration>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
    <profile>
        <id>logReader</id>
        <build>
            <finalName>${project.artifactId}</finalName>
            <plugins>
                ...
                <plugin>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>2.4</version>
                    <configuration>
                        <appendAssemblyId>false</appendAssemblyId>
                        <finalName>${project.artifactId}-logReader</finalName>
                        <archive>
                            <manifest>
                                <mainClass>fully.qualified.path.LogReader</mainClass>
                            </manifest>
                        </archive>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                    </configuration>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>
Run Code Online (Sandbox Code Playgroud)

实际上,两者之间的唯一区别是插件中定义的"finalName"和"mainClass"元素.

当我尝试在两个配置文件上执行mvn:package时(顺便说一句,我使用IntelliJ IDEA),我得到两个.jar文件,但是一个是正确的,另一个是不正确的."正确"的包含所有依赖项和有效的MANIFEST.MF文件."不正确"的一个不包含依赖项,MANIFEST.MF文件缺少我需要的"Main-Class"属性,以使其可执行.

我发现,如果我只运行一个配置文件或另一个配置文件,它工作正常但是,如果我尝试一次执行两个配置文件,它会失败.我的日志中也有以下注释,但我必须承认我并不完全理解他们的意思:

[INFO] Building jar: .../target/publisher.jar
...
[INFO] …
Run Code Online (Sandbox Code Playgroud)

java maven maven-assembly-plugin

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

为什么可以在其定义中实例化类?

一位同事(他是Java的新手)今天停下来问了一个看似简单的问题.不幸的是,我做了一个非常可怕的工作,试图向他解释.他有一本书有一些看起来像这样的代码:

class XCopy {

    public static void main(String[] args) {
        XCopy x = new XCopy(); // 1
        x.doIt();
    }

    public void doIt() {
        // Some code...
    }
}
Run Code Online (Sandbox Code Playgroud)

他在第1行感到困惑.他想知道的是为什么可以在XCopy类的定义中创建一个新的XCopy实例.他认为这会产生某种前向引用错误.毕竟,我们还没有宣布XCopy类是什么,所以我们怎么能创建一个呢?

我当然知道这是有效的代码,但是,当我试图向他解释时,我发现自己磕磕绊绊的答案,我担心他比他开始时更加困惑.我想听听其他解释为什么会这样.

有什么想法吗?为什么你可以在类的定义中实例化一个类的实例呢?

java

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

打印时防止表中的分页符

我有一个页面,我正在尝试设置打印.此页面包含大量单个表.这些表的大小各不相同,但一般来说,我每页可以容纳2.5到3个表.我希望能够防止表被分页符破坏.知道我怎么能做到这一点?

我试过这个:

.reportTable {
    page-break-inside: avoid;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,page-break-insideOpera似乎只支持(根据W3Schools - 我证实这在Firefox 4.0.1中不起作用).

我可以这样做,以便在每个表之前强制分页:

.reportTable {
    page-break-after: always;
}
Run Code Online (Sandbox Code Playgroud)

本工程以插入分页符,似乎在所有的主流浏览器的支持,但它让我与印刷文件吨浪费的空间(大约一半每一页的空白).如果整个下一个表格不适合此页面,我真的只想要一个分页符.

我知道我有用户使用Internet Explorer,Firefox和Safari,所以我真的希望尽可能地支持这些用户.找到一些可以在Chrome和Opera中运行的东西将是一个非常好的奖励.

有任何想法吗?

css printing

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

如何正确关闭资源

当我清理一些代码时,FindBugs向我指出了一些使用Connection,CallableStatement和ResultSet对象的JDBC代码.这是该代码的片段:

CallableStatement cStmt = getConnection().prepareCall("...");
...
ResultSet rs = cStmt.executeQuery();

while ( rs.next() )
{
    ...
}

cStmt.close();
rs.close();
con.close();
Run Code Online (Sandbox Code Playgroud)

FindBugs指出这些应该在finally块中.我开始重构我的代码来执行此操作,我开始想知道如何处理finally块中的代码.

创建CallableStatement的Connection对象可能会抛出异常,将ResultSet对象保留为null.当我尝试关闭ResultSet时,我会得到一个NullPointerException,反过来,我的Connection将永远不会被关闭.实际上,这个线程提出了相同的概念,并表明将close()调用包装在null检查中是个好主意.

但是其他可能的例外呢?根据Java API规范,如果发生数据库错误,Statement.close()可以抛出SQLException.因此,即使我的CallableStatement不为null并且我可以在其上成功调用close(),我仍然可能会得到一个异常并且没有机会关闭我的其他资源.

我能想到的唯一"故障安全"解决方案是将每个close()调用包装在自己的try/catch块中,如下所示:

finally {

    try {
        cStmt.close();
    } catch (Exception e) { /* Intentionally Swallow  Exception */ }

    try {
        rs.close();
    } catch (Exception e) { /* Intentionally Swallow  Exception */ }

    try {
        con.close();
    } catch (Exception e) { /* Intentionally Swallow  Exception */ }

}
Run Code Online (Sandbox Code Playgroud)

男孩,如果那看起来不太可怕.有没有更好的方法来解决这个问题?

java jdbc

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

什么是扩展功能的最佳方式?

我遇到了一个扩展给定类功能的情况,但我不确定最好的方法.我开始调用"向上"功能,现在切换到"向下",但我看到两者都有问题.让我解释一下我的意思.首先,"向上"的方法:

public class ParentValidator
{
    public void validate() {
        // Some code
    }
}

public class ChildValidator extends ParentValidator
{
    @Override
    public void validate() {
        super.validate();
        // Some code
    }
}

public class GrandchildValidator extends ChildValidator
{
    @Override
    public void validate() {
        super.validate();
        // Some code
    }
}
Run Code Online (Sandbox Code Playgroud)

这个功能非常好,但它要求我总是记得在我的方法体中放置super.validate()或者不会执行父类中的逻辑.此外,由于子类实际上可以替换/修改父类中定义的代码,因此以这种方式扩展可以被认为是"不安全的".这就是我称之为"向上"调用方法的原因,因为我正在调用更高级别的方法.

为了解决这些不足,我决定让ParentValidator.validate()最终并让它调用一个不同的方法.这是我的代码被修改为:

public class ParentValidator
{
    public final void validate() {
        // Some code

        subValidate();
    }

    protected void subValidate() {}
}

public class ChildValidator extends ParentValidator
{
    @Override
    public final void subValidate() …
Run Code Online (Sandbox Code Playgroud)

java

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

如何从列表中筛选元素

我正在尝试实现一个相当简单的方法,我想过滤一个列表.这是一个File对象列表,应该只有一个以.asp结尾的文件 - 我希望从列表中排除一个.请记住,我实际上并不想从列表中删除此文件,我只是希望能够忽略该列表的特定迭代.

我的原始(蛮力)实现看起来像这样:

public List<File> getSurveyFiles() throws Exception {
    List<File> surveyFiles = new ArrayList<File>(files.size() - 1);

    for ( File f : files ) {
        if ( !f.getName().endsWith(".asp") ) {
            surveyFiles.add(f);
        }
    }

    return surveyFiles;
}
Run Code Online (Sandbox Code Playgroud)

它可以工作,但是我创建第二个列表并从一个列表到另一个列表进行大量复制时感觉非常浪费.

我玩弄的另一个选择是使用guava-libraries(http://code.google.com/p/guava-libraries/)并利用他们的过滤功能,如下所示:

public class SurveyFileControllerPredicate implements Predicate<File> {

    @Override
    public boolean apply(File file) {
        return file.getName().endsWith(".asp");
    }
}

...

public Iterable<File> getSurveyFiles() throws Exception {

    return Iterables.filter(
        files,
        Predicates.not(new SurveyFileControllerPredicate())    
    );

}
Run Code Online (Sandbox Code Playgroud)

filter的实现在迭代时删除.asp文件,而不是提前删除.所以这段代码的好处是没有制作第二个List,但我觉得它使我的代码更复杂.

还有其他更简单的实现我不考虑吗?

在整个方案中,我选择的实现可能并不重要.我只是好奇其他开发者如何解决这个问题以及他们会选择哪种选择.

谢谢.

java guava

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

标签 统计

java ×6

checkstyle ×1

css ×1

guava ×1

jdbc ×1

maven ×1

maven-assembly-plugin ×1

printing ×1