2012-03-06 3 views
1

Я создаю определенный класс, используяJava класс с парами статического массива значений

MyClass class1 = new MyClass(ClassA.StaticSet1, ClassA.StaticCoef1); 
MyClass class2 = new MyClass(ClassB.StaticSet1, ClassB.StaticCoef1); 

поэтому я хотел бы собрать все эти статические значения в одном классе, и называть их, используя нечто вроде

MyClass class1 = new MyClass(TopClass.Obj1); 
MyClass class2 = new MyClass(TopClass.Obj2); 

где Obj1 и Obj2 являются статическими объектами, содержащими вышеупомянутые пары значений.

ближе, что я мог сделать, было создание статических классов внутри TopClass и расширения один базовый класс , так что я получил эту уродливую реализацию

Public class TopClass{ 
    public static class Base{ 
     public String set[]; 
     public double coef[]; 
     public Base(s, c){ 
      set = s; 
      coef = c; 
     } 

    } 
    public static class Obj1 extends Base{ 
     public static String set[] = {"a","b","C"}; 
     public static double coef[]= {1,2,3}; 
     public Obj1(){ 
      super(set, coef); 
     } 

    } 
    public static class Obj2 extends Base{ 
     public static String set[] = {"x","y","z"}; 
     public static double coef[]= {11,12,13}; 
     public Obj2(){ 
      super(set, coef); 
     } 


    } 

} 

тогда я называю их

Myclass class1 = new MyClass((TopClass.Base)(new TopClass.Obj1()); 
Myclass class2 = new MyClass((TopClass.Base)(new TopClass.Obj2()); 

, но это WASN что я точно хотел, потому что класс стал громоздким, особенно, что я буду создавать многие из этих записей. любое понимание будет высоко ценится :)

спасибо,

Хани

+1

Почему члены являются статическими? –

+0

, потому что они переданы конструктору базового класса – hini

+0

являются членами окончательного? –

ответ

0

Это будет отличное место для использования шаблона Factory. Может быть что-то вроде:

public class SetCoefProvider { 
    private String[] set; 
    private double[] coef; 

    public SetCoefProvider(String[] set, double[] coef) { 
    this.set = set; 
    this.coef = coef; 
    } 

    public String[] getSet() { 
    return set; 
    } 
    public double[] getCoef() { 
    return coef; 
    } 
} 

public class SetCoefProviderFactory { 
    public static SetCoefProvider createObj1Provider() { 
    return new SetCoefProvider(new String[] {"a", "b", "c"}, new double[] {1,2,3}); 
    } 
    public static SetCoefProvider createObj2Provider() { 
    return new SetCoefProvider(new String[] {"x", "y", "z"}, new double[] {11,12,13}); 
    } 
} 

, а затем, если вы действительно хотите, чтобы они были одиночками, вы всегда можете сделать что-то вроде:

public class SingletonSetCoefProviders { 
    private static SetCoefProvider obj1Provider, obj2Provider; 

    static { 
    obj1Provider = SetCoefProviderFactory.createObj1Provider(); 
    obj2Provider = SetCoefProviderFactory.createObj2Provider(); 
    } 

    public static SetCoefProvider getObj1Provider() { 
    return obj1Provider; 
    } 
    public static SetCoefProvider getObj2Provider() { 
    return obj2Provider; 
    } 
} 
0

я бы инкапсулирует Object1 и Объект2, почему, чтобы убедиться, что они доступны для использования и доступа, по крайней мере, не являются нулевыми. см. ниже:

public static TopClass(){ 
    private static Object obj01 = null; 
    private static Object obj02 = null; 

    public Object getObj01(){ 
     if(obj01 == null){ 
      obj01 = new Object(); 
     } 

     return (obj01); 
    } 

    public Object getObj02(){ 
     if(obj02 == null){ 
      obj02 = new Object(); 
     } 

     return (obj02); 
    } 
} 

или в вашем случае объекты находятся в тире массива [].

0

Я буду создавать многие из этих записей. любое понимание будет высоко ценится :)

Идея заключается в том, что с статике, вы не хотите сделать многие из них, что весь смысл статической вещи. Переосмысление и/или повторное задание с большим контекстом о ваших целях, то, что вы намереваетесь выполнить, непонятно.

+0

Я мог бы создать класс, содержащий все эти статические значения, и просто использовать MyClass class1 = new MyClass (TopClass.ClassA_StaticSet1, TopClass.ClassA_StaticCoef1); , но я хочу узнать, есть ли более элегантный способ сделать это. – hini

+0

Это кажется очень громоздким, потому что ваши статические внутренние классы статичны, и их не должно быть. Не зная больше (и я не хочу знать больше), я бы сказал, что их следует повысить до классов экземпляров. – Pedantic

0

Я не получаю статическую часть. почему бы не сделать что-то вроде:

import java.util.*; 
interface Foo { 
    String[] set(); 
    double[] coef(); 
} 
class FooImpl1 implements Foo { 
    @Override public String[] set() { 
     return set; 
    } 
    @Override public double[] coef() { 
     return coef; 
    } 
    String set[]={"a","b","C"}; 
    double coef[]={1,2,3}; 
} 
class FooImpl2 implements Foo { 
    @Override public String[] set() { 
     return set; 
    } 
    @Override public double[] coef() { 
     return coef; 
    } 
    String set[] = {"x","y","z"}; 
    double coef[]= {11,12,13}; 
} 
interface Bar { 
    Foo foo1=new FooImpl1(); 
    Foo foo2=new FooImpl2(); 
} 
public class So9577640 { 
    public static void main(String[] args) { 
     Foo foo1=new FooImpl1(); 
     System.out.println(Arrays.asList(foo1.set())); 
     Foo foo2=new FooImpl2(); 
     System.out.println(Arrays.asList(foo2.set())); 
     System.out.println(Arrays.asList(Bar.foo1.set())); 
     System.out.println(Arrays.asList(Bar.foo2.set())); 
    } 
} 
Смежные вопросы