使接口实现类静态时出错

时间:2015-12-05 16:05:32

标签: java arrays oop interface static

假设我有一个如下定义的简单界面:

public interface Cipher
{
  public String encode(String original);
  public String decode(String encoded);
}

在此示例中,界面用于创建表示不同基本密码的几个对象。一种这样的密码通过获取给定的字符串并通过从数组的左上角开始并在移动到下一行之前跨过每一行来逐字符地输入二维数组来工作。 encode方法通过在移动到下一列之前按下每列来读取此数组来创建编码字符串。这显示在下面的代码中:

public class TopLeftColumnRow implements Cipher
{
public TopLeftColumnRow()
{

}
public String encode(String original)
{
    String encoded = "";
    int dimension;
    int x=0;
    int y=0;
    int pos=0;
    dimension = ((int)Math.ceil(Math.pow((double)original.length(),0.5)));
    String[][] LocalBox = new String[dimension][dimension];
    for(x=0;x<dimension;x++)
    {
        for(y=0;y<dimension;y++)
        {
            try
            {
            LocalBox[x][y]=original.substring(pos,pos+1);
            pos++;
            }catch(StringIndexOutOfBoundsException ex)
            {
                LocalBox[x][y]="*";
            }//catch(StringIndexOutOfBoundsException ex)
        }//for(y=0;y<dimension;y++)
    }//for(x=0;x<dimension;x++)             

   for(y=0;y<dimension;y++)
    {
       for(x=0;x<dimension;x++)
       {
           encoded+=LocalBox[x][y];
       }//for(x=0;x<dimension;x++)
    }//for(y=0;y<dimension;y++)
    return encoded;
}//encode

public String decode(String encoded)
{

    int dimension;
    int x=0;
    int y=0;
    int pos=0;
    dimension = ((int)Math.ceil(Math.pow((double)encoded.length(),0.5)));
    String[][] LocalBox = new String[dimension][dimension];
    String decoded="";
    for(x=0;x<dimension;x++)
    {
        for(y=0;y<dimension;y++)
        {
            try
            {
            LocalBox[y][x]=encoded.substring(pos,pos+1);
            pos++;
            }catch(StringIndexOutOfBoundsException ex)
            {
                LocalBox[y][x]="*";
            }//catch(StringIndexOutOfBoundsException ex)                           
        }//for(y=0;y<dimension;y++)                
    }//for(x=0;x<dimension;x++)

    for(y=0;y<dimension;y++)
    {
        for(x=0;x<dimension;x++)
        {
            if((LocalBox[y][x].compareTo("*"))!=0)
                decoded+=LocalBox[y][x];
        }//for(x=0;x<dimension;x++)
    }//for(y=0;y<dimension;y++)
    return decoded;
}//decode
}//TopLeftColumnRow

由于加密算法每次都完全相同,并且没有存储任何属性,因此将TopLeftColumnRow设为static类是有意义的,但这样做是这样的:

public static class TopLeftColumnRow implements Cipher

创建错误。 Java是否允许一般的接口静态实现,或者这是我的特定错误?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

Java无法将顶级类设为静态,但您可以按照以下步骤创建静态类:

  • 使类final - 防止扩展类,因为扩展静态类是没有意义的
  • Make constructor private - 防止客户端代码实例化,因为实例化静态类没有意义
  • 声明类static的所有成员和函数 - 由于无法实例化类,因此无法调用实例方法或访问实例字段

示例:

// A top-level Java class mimicking static class behavior
public final class MyStaticClass {
    private MyStaticClass () { // private constructor
        myStaticMember = 1;
    }
    private static int myStaticMember;
    public static void setMyStaticMember(int val) {
        myStaticMember = val;
    }
    public static int getMyStaticMember() {
        return myStaticMember;
    }
    public static int squareMyStaticMember() {
        return myStaticMember * myStaticMember;
    }
}

public class TestStaticClass {
     public static void main(String []args){
        MyStaticClass.setMyStaticMember(5);
        System.out.println("Static value: " + MyStaticClass.getMyStaticMember());
        System.out.println("Value squared: " + MyStaticClass.squareMyStaticMember());
        // MyStaticClass x = new MyStaticClass(); // results in compile time error
     }
}

静态类的一个好用途是定义一个实例化它没有意义的类。如果Java允许将顶级类声明为静态,那么Java的Math类将是静态的。