使用静态方法和静态字段返回对类的引用而不实例化

时间:2016-07-01 07:00:36

标签: java

我想创建一个包装类,它从一个我无法查看代码的库提供的类中调用静态方法和成员字段。

这是为了避免在需要在特定上下文中使用静态方法时全局成员字段的样板设置代码。

我想尽量避免为每个静态方法创建包装器方法。

我的问题:

是否可以从一个方法返回一个带静态方法的类来访问静态方法而不实例化它?

代码在下面,注释符合内容。

代码用于演示调用方法getMath()时静态值的变化。

我想在调用静态方法之前避免设置值。

StaticMath.setFirstNumber(1);
StaticMath.calc(1);

StaticMath.setFirstNumber(2);
StaticMath.calc(1);

我正在使用Eclipse IDE,它提出了警告,我理解,但我想避免。

我尝试搜索有关此主题的内容,因此如果有人可以提供链接,我可以关闭此内容。

public class Demo {
    // Static Methods in a class library I don't have access to. 
    static class StaticMath {
        private static int firstNum;

        private StaticMath() {  
        }

        public static int calc(int secondNum) {
            return firstNum + secondNum;
        }

        public static void setFirstNumber(int firstNum) {
            StaticMath.firstNum = firstNum;
        }
    }

    // Concrete Class
    static class MathBook {
        private int firstNum;

        public MathBook(int firstNum) {
            this.firstNum = firstNum;
        }

        // Non-static method that gets the class with the static methods.
        public StaticMath getMath() {
            StaticMath.setFirstNumber(firstNum);
            // I don't want to instantiate the class.
            return new StaticMath();
        }
    }

    public static void main(String... args) {
        MathBook m1 = new MathBook(1);
        MathBook m2 = new MathBook(2);

        // I want to avoid the "static-access" warning.
        // Answer is 2
        System.out.println(String.valueOf(m1.getMath().calc(1)));
        // Answer is 3
        System.out.println(String.valueOf(m2.getMath().calc(1)));
    }
}

3 个答案:

答案 0 :(得分:2)

我只是将它包起来进行原子操作:

public static class MyMath{

    public static synchronized int myCalc( int num1 , int num2 ){
         StaticMath.setFirstNum(num1);
         return StaticMath.calc(num2);
    }

}

缺点:你必须确保StaticMath没有被用来避免这种情况"桥接"类。

用法:

int result1 = MyMath.myCalc( 1, 1 );
int result1 = MyMath.myCalc( 2, 1 );

答案 1 :(得分:1)

你不应该通过对象引用调用静态方法。你应该直接使用类引用来调用这样的静态方法:

StaticMath.calc(1)

但是如果由于某种原因仍然需要它,你可以在getMath方法中返回null,但是你仍然会在Eclipse中收到警告:

public StaticMath getMath() {
    StaticMath.setFirstNumber(firstNum);
    return null;
}

答案 2 :(得分:1)

我推断,如果答案不是

,则问题没有被正确询问
   StaticMath.calc(1)

由于对静态内部类的包可见性,您可能面临的其他问题。这是Demo类作者的设计选择。如果您可以将MathBook和StaticMath类标记为public,那么您可以像下面这样访问它们:

   Demo.StaticMath.calc(1);