小编den*_*chr的帖子

制造多态的麻烦使那些开关/案例陈述失败

继续前面的问题(这里这里),我实现了一个基本的命令模式,创建了我的命令类并编码到一个接口,所以当使用任何命令时,调用该execute()方法.

但是,我仍然发现自己无法动摇这些案例陈述:我正在从主/决定字符串中读取每个字符,字符串由随机的,重复的字符A,B,C或D组成,然后我检索相关的实现来自地图的命令并调用其execute方法.

我的设计是这样的:

public interface Command {
    void execute();
}

public class CommandA implements Command{
  //implements execute() method
}

private Map myMap= new HashMap();
myMap.put("A", new CommandA);
myMap.put("B", new CommandB);
myMap.put("C", new CommandC);
myMap.put("D", new CommandD);
Run Code Online (Sandbox Code Playgroud)

但是,当我阅读每条指令时,我再次诉诸案例陈述:

switch(instructionFromString){
case 'A':{myMap.get("A").execute(); break;}
case 'B':{myMap.get("B").execute(); break;}
case 'C':{myMap.get("C").execute(); break;}
case 'D':{myMap.get("D").execute(); break;}
Run Code Online (Sandbox Code Playgroud)

显然,在某种程度上我设法击败了多态性对案例陈述的优势.

它可能是我选择存储命令的那种数据结构吗?它很可能是一个永久的数据结构,只需从中提取这些命令.

我想到的另一件事是我在地图中使用的键/值命名.我试图从概念上将每个存储的命令链接到其相关指令的方式?即命令"A"的实现是用键'A'存储在地图上的,因此它可以匹配相应的指令"A"?在我看来,这似乎有点不太可能.

关于我下一步一劳永逸地删除这些案例陈述的任何暗示或进一步建议都将受到高度赞赏.提前谢谢了

java polymorphism conditional design-patterns switch-statement

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

标记方法并通过标记从客户端对象调用它们

我一直试图找到一种方法来从我的基类中标记几个方法,以便客户端类可以通过标记来调用它们.示例代码是:

public class Base {
         public void method1(){     
        ..change state of base class
    }

    public void method2(){      
        ..change state of base class
    }

    public void method3(){      
        ..change state of base class
    }
}
Run Code Online (Sandbox Code Playgroud)

main()方法的客户端类将通过随机指令序列调用Base的每个方法:

public static void main(String[] args) {
String sequence = "ABCAABBBABACCACC"
Base aBase = new Base();
for (int i = 0; i < sequence.length(); i++){
            char temp = sequence.charAt(i);
            switch(temp){
            case 'A':{aBase.method1(); break;}
            case 'B':{aBase.method2(); break;}
            case 'C':{aBase.method3(); break;}          }
        }

        System.out.println(aBase.getState());

    }
Run Code Online (Sandbox Code Playgroud)

现在我希望从Client对象中完全摆脱switch语句.我知道通过多态替换switch的技术,但是想避免创建一组新类.我希望简单地将这些方法存储在适当的数据结构中,并以某种方式用序列中的匹配字符标记它们.

地图可以轻松地存储具有值/键对的对象,这些对象可以完成工作(如我在 …

java oop methods design-patterns switch-statement

5
推荐指数
2
解决办法
194
查看次数

最短路径算法的修改(从节点到自身的路由)

我将全对最短路径算法(Floyd-Warshall)应用于此有向图: alt text http://www.freeimagehosting.net/uploads/99b00085bf.jpg

该图由其邻接矩阵表示.简单的代码如下所示:

public class ShortestPath {

public static void main(String[] args) {
    int x = Integer.MAX_VALUE;
    int [][] adj= {      
      {0, 6, x, 6, 7}, 
            {x, 0, 5, x, x}, 
            {x, x, 0, 9, 3}, 
            {x, x, 9, 0, 7}, 
            {x, 4, x, x, 0}};

    int [][] D = adj;

    for (int k=0; k<5; k++){
        for (int i=0; i<5; i++){
            for (int j=0; j<5; j++){
                if(D[i][k] != x && D[k][j] != x && D[i][k]+D[k][j] < …
Run Code Online (Sandbox Code Playgroud)

java algorithm graph shortest-path data-structures

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

用ant编译junit测试类的问题

我在将junit与工作的ant build.xml文件集成时遇到问题.我的测试类与我的源类位于同一目录中.在我学习如何使用ant时,我只想编译所有源代码和测试类.

我正在使用eclipse,junit测试类在通过eclipse执行时工作正常.这意味着使用junit.jar和ant-junit-1.7.0.jar正确设置了类路径(至少从eclipse的角度来看),尽管我不确定后一个jar是否绝对必要.

我的文件夹结构是:

src/code/MyClass.java src/code/MyClassTest.java

并且ant文件只包含一个目标,只是为了编译MyClass和MyClassTest,我现在不包含任何junit任务,并且不介意将构建文件放在同一目录中:

<target name="compile" >
  <javac srcdir="src/" />
</target>
Run Code Online (Sandbox Code Playgroud)

Ant工作正常,直到我在我的文件夹中添加了MyClassTest.java(带注释的Junit).输出是:

[javac] C:\....\src\MyClassTest.java:3: package org.junit does not exist
cannot find symbol
Run Code Online (Sandbox Code Playgroud)

我的想法是,Ant无法找到junit库.由于我没有指定类路径,我假设Ant会查找与源文件相同的位置以查找它需要的内容...我怎么能告诉Ant junit jar就在那里?

任何想法,真的很感激.问候

java eclipse ant junit

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

在方法中重构多个if-else条件

我正在重构我现有的代码.它实际上工作正常,但它有点混乱,多个if-else条件检查一个变量的值,并将第二个变量的值更改为从固定枚举结构中获取的更新值.

else if (var1 == 'valueX')
{
    if (var2 == MyEnum.A)
        var2 = MyEnum.B;
    else if (var2 == MyEnum.B)
        var2 = MyEnum.C;
    else if (var2 == MyEnum.C)
        var2 = MyEnum.D;
    else if (var2 == MyEnum.D)
        var2 = MyEnum.A;
}

else if (....)
{
..similar block of conditionals
}
Run Code Online (Sandbox Code Playgroud)

关于重构和清理这段代码的最佳方法,我有点困惑.你会建议使用开关吗?还是更优雅的东西?

提前致谢!

java refactoring conditional

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

有向加权图的邻接表

我使用邻接列表来表示有向加权图,并根据 SO问题提供的示例代码,我创建了以下内容:

import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;

public class _Graph {
    private Map<String, LinkedHashSet<HashMap<String, Integer>>> map = new HashMap<String, LinkedHashSet<HashMap<String, Integer>>>();

    public void addEdge(String node1, String node2, int dist) {
        LinkedHashSet<HashMap<String, Integer>> adjacent = map.get(node1);
        HashMap<String, Integer> innerMap = new HashMap<String, Integer>();
        if(adjacent==null) {
            adjacent = new LinkedHashSet<HashMap<String, Integer>>();                       
            map.put(node1, adjacent);
        }
        innerMap.put(node2, dist);
        adjacent.add(innerMap);
    }

    public boolean isConnected(String node1, String node2) {
        Set<HashMap<String, Integer>> adjacent = map.get(node1);
        if(adjacent==null) {
            return false;
        }
        return …
Run Code Online (Sandbox Code Playgroud)

java collections adjacency-list

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

使用ant的java任务和类路径的ClassNotFoundException

我试图在eclipse中编译并运行一个简单的java类.编译任务工作正常,因为我没有指定目标文件夹,所以构建文件与源位于同一目录中.哪个没关系,目前我需要的是学习如何使用main()方法运行该类.

我已经尝试使用类的完全限定名称(包名称等)和类名,但总是得到一个java.lang.ClassNotFoundException

    Buildfile: C:\Users....\build.xml
    run:
         [java] java.lang.NoClassDefFoundError: code/control/MyClass
         [java] Caused by: java.lang.ClassNotFoundException: code.control.MyClass
         [java]     at java.net.URLClassLoader$1.run(Unknown Source)
         [java]     at java.security.AccessController.doPrivileged(Native Method)
         [java]     at java.net.URLClassLoader.findClass(Unknown Source)
         [java]     at java.lang.ClassLoader.loadClass(Unknown Source)
         [java]     at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
         [java]     at java.lang.ClassLoader.loadClass(Unknown Source)
         [java]     at java.lang.ClassLoader.loadClassInternal(Unknown Source)
         [java] Could not find the main class: code.control.MyClass.  Program will exit.
         [java] Exception in thread "main" 
         [java] Java Result: 1
    compile:
    default:
    BUILD SUCCESSFUL
 Total time: 234 milliseconds
Run Code Online (Sandbox Code Playgroud)

下面是我的build.xml文件中的目标:

<target name="default" depends="compile" description="learn">

</target>

  <target name="compile" depends="run">
            <javac srcdir="src/" …
Run Code Online (Sandbox Code Playgroud)

java ant classpath

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

如何在Java中的同一个类中为多个枚举成员使用toString()方法

我正在尝试为同一个类中的多个枚举成员添加更多用户友好的描述.现在我只让每个枚举以小写形式返回:

public enum Part {
    ROTOR, DOUBLE_SWITCH, 100_BULB, 75_BULB, 
    SMALL_GAUGE, LARGE_GAUGE, DRIVER;

    private final String description;

    Part() {
      description = toString().toLowerCase();
    }

    Part(String description) {
      this.description = description;
    }

    public String getDescription() {
      return description;
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法给每个枚举值一个更加用户友好的名称,我可以通过toString()为每个Part成员显示?例如,当我对部件进行交互时:

for (Part part : Part.values()) {
System.out.println(part.toString());
}
Run Code Online (Sandbox Code Playgroud)

而不是获得文字列表:

ROTOR
DOUBLE_SWITCH
100_BULB
75_BULB 
SMALL_GAUGE
LARGE_GAUGE
DRIVER
Run Code Online (Sandbox Code Playgroud)

我希望对每个项目给出有意义的描述,这样我就可以输出如下内容:

Standard Rotor
Double Switch
100 W bulb
75 W bulb 
Small Gauge
Large Gauge
Torque Driver
Run Code Online (Sandbox Code Playgroud)

所以我想知道是否有办法为我的Part枚举类中的每个枚举成员提供有意义的描述.

非常感谢

java enums tostring

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

范围局部变量和条件的问题

我正在尝试构造一个返回布尔值的方法:

public boolean isStringValid(String s){
    boolean isValid;
    String temp = null;     
    // only combinations of 'A','B','C' are allowed
    for (int i = 0; i < s.length(); i++)
    {
        temp = s.substring(i, i+1);
        if (temp.equals("A")|temp.equals("B")|temp.equals("C")){
            isValid= true;
        }else{
            isValid= false;
        }
    }   
    return isValid;
}
Run Code Online (Sandbox Code Playgroud)

但是我收到编译器错误,说"本地变量isValid可能尚未初始化".

我想要做的是取一个字符串并检查它的每个字母,如果在字符串中找到除A,B或C以外的任何字母,则isStringValid方法应该返回false.只有在检查完每个字母并找到A,B或C后,该方法才能返回true.

我想我无法搞清楚局部变量的范围.该方法从if/else块返回的适当方法是什么?如果那是不可能的,你会建议最好的设计方法是什么?

谢谢你们最诚挚的问候

java variables core local

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

单元测试退出应用程序的Java构造函数

重复:Java:如何测试调用System.exit()的方法?


我在为通过调用退出应用程序的方法设计单元测试时遇到了一些麻烦system.exit().实际上,这是一个类的构造函数,它测试某些条件并决定退出应用程序.所以我想测试这种特殊的可能性.

是否有一个特定的断言,我可以使用,或任何其他建议?

public MyClass(arg1, arg2, arg3){
    if(argsTestingIsOK){
        continue;       
    }else{
        System.exit(0);
    }
}
Run Code Online (Sandbox Code Playgroud)

java junit unit-testing

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